メインコンテンツまでスキップ

Pick<T, Keys>

Pick<T, Keys>は、型TからKeysに指定したキーだけを含むオブジェクト型を返すユーティリティ型です。

Pick<T, Keys>の型引数#

T#

型引数Tにはオブジェクト型を代入します。

Keys#

Keysにはオブジェクト型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; // 変更箇所
};

これらの定義が近くにある状態ならまだしも、異なるファイルにあれば非常に探し辛くなります。

そこでBookInputDataPick<T, K>を使って定義しなおします。

typescript
type BookInputData = Pick<Book, "title" | "author">;
typescript
type BookInputData = Pick<Book, "title" | "author">;

このようにすればBookInputDataは少なくともBookとコード上の繋がりができる上に、authorプロパティの型変更を自動で追従してくれるようになります。

関連情報#