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 の束縛の期待は元の型と同じままで、呼び出し方も変わりません。