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