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

Pick<T, Keys>

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

Pick<T, Keys>の型引数

T

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

Keys

Keysにはオブジェクトの型Tのプロパティキーを指定します。object型Tに存在しないプロパティーキーを指定するとコンパイルエラーになります。

Pickの使用例

ts
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">;
ts
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は次の型と同じになります。

ts
type Person = {
surname: string;
middleName?: string;
givenName: string;
};
ts
type Person = {
surname: string;
middleName?: string;
givenName: string;
};

Pickで型の変更に追従する例

書籍を扱うサービスを作ったとして、書籍を意味するオブジェクトBookが次のように定義されているとします。

ts
type Book = {
id: number;
title: string;
author: string;
createdAt: Date;
updatedAt: Date;
};
ts
type Book = {
id: number;
title: string;
author: string;
createdAt: Date;
updatedAt: Date;
};

これを参考にしてBookを作成するための入力データとしてBookInputDataを作るとします。これは外部からのリクエストで作成され、id, createdAt, updatedAtはこのサービスで後付けで割り当てられるとすればBookInputDataは次になります。

ts
type BookInputData = {
title: string;
author: string;
};
ts
type BookInputData = {
title: string;
author: string;
};

ここでauthorプロパティがstringではなくPersonになる必要があったとします。Book, BookInputDataを独立して定義しているとこの変更のために都度、各々のauthorプロパティを変更する必要があります。

ts
type Book = {
id: number;
title: string;
author: Person; // 変更箇所
createdAt: Date;
updatedAt: Date;
};
 
type BookInputData = {
title: string;
author: Person; // 変更箇所
};
ts
type Book = {
id: number;
title: string;
author: Person; // 変更箇所
createdAt: Date;
updatedAt: Date;
};
 
type BookInputData = {
title: string;
author: Person; // 変更箇所
};

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

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

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

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

関連情報

📄️ Omit<T, Keys>

任意のプロパティを除いたオブジェクト型を作る