TypeScriptで特定のプロパティがない型を定義したい
#TypeScript
方法
こちらのStack Overflowの回答がシンプル。安全性向上のためKを改良している。後述する。
reactjs - TypeScript: remove key from type/subtraction type - Stack Overflow
code:ts
type Without<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
PickとExcludeはTypeScript標準定義されている。
使い方
code:ts
// (この型のプロパティのない版を定義していく感じ)
type User = {
id: number,
name: string,
birthDate: Date,
}
// 「id: number」なしで定義できる
const u1: Without<User, 'id'> = {
name: 'jack',
birthDate: new Date()
};
// 「id: number」と「birthDate: Date」なしで定義できる
const u2: Without<User, 'id' | 'birthDate'> = {
name: 'jack',
};
安全性の向上
安全性を高める目的でK extends keyof Tを追加している。これによりKはTにあるプロパティが来ないとコンパイルエラーを起こせるようになる。
余談
自分で作ったものはPickの部分を自作してしまって長くなってしまっていた。PickもTypeScript標準で使えるようになっているので、積極的に使ったほうがシンプルで慣れれば分かりやすくなるはず。
追記:Omit
TypeScript 3.5.1で以下のOmit`が定義された様子。
code:ts
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
(参考:)
なんでkeyof anyなのだろうか?keyof Tでは何か問題があるのだろうか?
このPR https://github.com/microsoft/TypeScript/pull/31205 で同じ疑問持った人がいる感じ。