TypeScript 中の Omit<T, K> の使用目的は何ですか
Nestjs を再学習する際、TS で Repository 内でOmit<XXXEntity,'xxx'>
の使用法をよく見かけますが、以前は使ったことがなく意味も分からなかったので、チュートリアルをそのままコピーしていました。
しかし、頻度が高すぎるので、もう少し掘り下げてみることにしました。自分が何を書いているのか分からないままずっと続けるわけにはいかないですからね - -!、だからソースコードを見てみることにしましょう〜
まず結論を言います:
Omit<T, K> は、指定されたプロパティ K を型 T から除外した新しい型を作成する役割を持ちます。
以下のコードを見てみましょう。
type Omit<T, K extends string | number | symbol> = {
[P in Exclude<keyof T, K>]: T[P];
};
- T は元の型で、操作するオブジェクトの型を表します。
- K はユニオン型で、T から除外するプロパティの型を表します。
まず、keyof T
はインデックス型クエリ(Index Type Query)で、型 T のすべてのプロパティ名のユニオン型を返します。
次に、Exclude<keyof T, K>
を使用してプロパティ K を除外します。これにより、K の型を除いたkeyof T
のプロパティ名のユニオン型が返されます。
最後に、マップ型の構文[P in Exclude<keyof T, K>]: T[P]
を使用して、元の型 T のプロパティと同じ型のプロパティを持つ新しい型を作成します。
要するに、Omit<T, K> 型は、元の型 T から指定されたプロパティ K を除外した新しい型を作成するために使用できます。
例えば、Person という型があるとします:
type Person = {
name: string;
age: number;
email: string;
};
Omit 型を使用して、Person 型から email プロパティを除外した新しい型 PersonWithoutEmail を作成できます:
type PersonWithoutEmail = Omit<Person, 'email'>;
これにより、PersonWithoutEmail 型には name と age のプロパティのみが含まれ、email プロパティは含まれません。
const person: PersonWithoutEmail = {
name: 'John',
age: 30,
};
Omit 型を使用することで、元の型から指定されたプロパティを簡単に除外した新しい型を作成することができます。