Pick<T, Keys>
Pick<T, Keys>は、型TからKeysに指定したキーだけを含むオブジェクト型を返すユーティリティ型です。
Pick<T, Keys>の型引数#
T#
型引数Tにはオブジェクト型を代入します。
Keys#
Keysにはオブジェクト型Tのプロパティキーを指定します。オブジェクト型Tに存在しないプロパティーキーを指定するとコンパイルエラーになります。
Pickの使用例#
typescripttype User = {surname: string;middleName?: string;givenName: string;age: number;address?: string;nationality: string;createdAt: string;updatedAt: string;};type Person = Pick<User, "surname" | "middleName" | "givenName">;
typescripttype User = {surname: string;middleName?: string;givenName: string;age: number;address?: string;nationality: string;createdAt: string;updatedAt: string;};type Person = Pick<User, "surname" | "middleName" | "givenName">;
上のPersonは次の型と同じになります。
typescripttype Person = {surname: string;middleName?: string;givenName: string;};
typescripttype Person = {surname: string;middleName?: string;givenName: string;};
Pickで型の変更に追従する例#
書籍を扱うサービスを作ったとして、書籍を意味するオブジェクトBookが次のように定義されているとします。
typescripttype Book = {id: number;title: string;author: string;createdAt: Date;updatedAt: Date;};
typescripttype Book = {id: number;title: string;author: string;createdAt: Date;updatedAt: Date;};
これを参考にしてBookを作成するための入力データとしてBookInputDataを作るとします。これは外部からのリクエストで作成され、id, createdAt, updatedAtはこのサービスで後付けで割り当てられるとすればBookInputDataは次になります。
typescripttype BookInputData = {title: string;author: string;};
typescripttype BookInputData = {title: string;author: string;};
ここでauthorプロパティがstringではなくPersonになる必要があったとします。Book, BookInputDataを独立して定義しているとこの変更のために都度、各々のauthorプロパティを変更する必要があります。
typescripttype Book = {id: number;title: string;author: Person; // 変更箇所createdAt: Date;updatedAt: Date;};type BookInputData = {title: string;author: Person; // 変更箇所};
typescripttype Book = {id: number;title: string;author: Person; // 変更箇所createdAt: Date;updatedAt: Date;};type BookInputData = {title: string;author: Person; // 変更箇所};
これらの定義が近くにある状態ならまだしも、異なるファイルにあれば非常に探し辛くなります。
そこでBookInputDataをPick<T, K>を使って定義しなおします。
typescripttype BookInputData = Pick<Book, "title" | "author">;
typescripttype BookInputData = Pick<Book, "title" | "author">;
このようにすればBookInputDataは少なくともBookとコード上の繋がりができる上に、authorプロパティの型変更を自動で追従してくれるようになります。