Pick
概要
Pick<T, K> は、
型 T から指定したキー K だけを取り出した新しい型を作るユーティリティ型です。
サンプルコード
type SimpleProfile = Pick<DetailedProfile, "name" | "weight">;
// type SimpleProfile = {
// name: string;
// weight: number;
// }
DetailedProfile の中から
name と weight だけを抜き出した型が作られています。
Pick の定義
type Pick<T, K extends keyof T> = { [Pin K]: T[P]; }
何をしているか
-
K extends keyof T-
KはTが持つキーのみ指定できる
-
-
[P in K]-
Kに含まれるキーを1つずつ取り出す
-
-
T[P]- 元の型
Tから対応するプロパティ型を参照する
- 元の型
つまり、
指定したキーだけで新しいオブジェクト型を再構築している
という仕組みです。
Omit
概要
Omit<T, K> は、
型 T から指定したキー K を除外した新しい型を作るユーティリティ型です。
サンプルコード
type SmallProfile = Omit<DetailedProfile, "height">;
// type SmallProfile = {
// name: string;
// weight: number;
// }
height プロパティだけを除外し、
残りの name と weight が保持されています。
Omit の定義
type Omit<T, K extends keyof any> = { [PinExclude<keyof T, K>]: T[P]; }
何をしているか
-
keyof T-
Tが持つすべてのキーのユニオン型
-
-
Exclude<keyof T, K>- その中から
Kを取り除く
- その中から
-
[P in ...]: T[P]- 残ったキーだけで型を再構築
つまり Omit は、
「keyof T」→「Exclude」→「Pick 的な再構築」
という流れで動いています。
Pick と Omit の関係
-
Pick:欲しいものを指定する -
Omit:いらないものを指定する
内部的には、
Omit は Exclude + Pick 的な処理で実装されています。
// イメージ
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
使い分けの目安
- プロパティが少なく、欲しいものが明確 →
Pick - プロパティが多く、不要なものだけ決まっている →
Omit
まとめ
-
Pickは 指定したキーだけを抽出 -
Omitは 指定したキーを除外 - どちらも Mapped Types と keyof を使って実装されている
-
OmitはExcludeを内部で利用している
参考