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