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