Pick<T, K>

最終更新:2026-10-22

Pick<T, K> Pick

Pick<T, K> は T から K で指定したプロパティを「選び出し」、新しい型を作ります。大きな型の一部分だけが必要なとき(リストの要約、サブセットのパラメータなど)、重複した型を手書きする必要がありません。しかも元の型のフィールドの型が変われば、Pick した型も自動的に追従します。

グループユーティリティ型
種類型
strict モード不要

ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。

📝 構文

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

// 使い方
type OrderSummary = Pick<Order, "id" | "buyer" | "total">;

⚙️ パラメータ

T元となるオブジェクト型です。プロパティはここから選びます
K extends keyof T残すキーのユニオンです。T に既存のキーでなければならず、キー名を書き間違えるとコンパイルエラーになります(これが Pick の安全装置です)

戻り値:新しい型です。K で指定したプロパティだけを含み、型は T の対応するプロパティと一致します。

▶ サンプル

下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:

出力:

{"id":"A-1024","buyer":"Carol","total":259}

(トランスパイル後の実行出力。OrderSummary 上で order.address にアクセスするとコンパイルエラーになります。Pick のホワイトリスト外のフィールドは型の上には存在しないからです)

💡 ポイント

ℹ️ 説明 実装は type Pick<T, K extends keyof T> = { [P in K]: T[P] } です。K はキーのユニオンで、マップ型が対応するプロパティの型を順に取り出します。
⚠️ 注意 Pick はホワイトリストです。後に Order に追加したフィールドは Pick の結果に自動的には現れません。意図が「全部は要るが一部を除きたい」なら Omit(ブラックリスト)を使うべきです。さもないと新しいフィールドが静かに漏れます。
💡 ヒント 経験則として、欲しいフィールドが少なければ Pick、除きたいフィールドが少なければ Omit です。どちらも型レベルの浅い選択で、ネストしたオブジェクトの参照は依然として共有されます。
ケースは今後追加予定です。

📚 関連チュートリアル

❓ よくある質問

Q Pick した後でプロパティを変更すると元のオブジェクトに影響しますか?
A Pick は型レベルでプロパティを選ぶだけで、データはコピーしません。実行時にオブジェクトをどう作るかはあなたのコード次第です(例の toSummary はデストラクチャで新しいオブジェクトを作っています)。同じオブジェクト参照を直接渡したなら、変更はもちろん互いに見えます。
Q Pick に存在しないキーを書くとどうなりますか?
A コンパイルエラーです。Type '"oderId"' is not assignable to type 'keyof Order' のように。K は keyof T に制約されているため、スペルミスは即座に露見します。ここが Pick が Omit より安全なところです(Omit にはこの検査がありません)。
Q Pick はメソッドも一緒に選べますか?
A できます。メソッドもプロパティの一種で、Pick<T, "save"> は { save: () => void } のような型を与えます。this の束縛の期待は元の型と同じままで、呼び出し方も変わりません。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%