インターセクション型 (intersection type)
考え方はユニオン型と相対するものです。ユニオン型がどれかを意味するならインターセクション型はどれもです。言い換えるとオブジェクトの定義を合成させることを指します。
インターセクション型を作るためには合成したいオブジェクト同士を&
で列挙します。
ts
typeTwoDimensionalPoint = {x : number;y : number;};typeZ = {z : number;};typeThreeDimensionalPoint =TwoDimensionalPoint &Z ;constp :ThreeDimensionalPoint = {x : 0,y : 1,z : 2,};
ts
typeTwoDimensionalPoint = {x : number;y : number;};typeZ = {z : number;};typeThreeDimensionalPoint =TwoDimensionalPoint &Z ;constp :ThreeDimensionalPoint = {x : 0,y : 1,z : 2,};
xy平面上の点を表すTwoDimensionalPoint
を拡張してxyz平面上の点のThreeDimensionalPoint
に変換しました。
プリミティブ型のインターセクション型
プリミティブ型のインターセクション型をつくることもできますが、作るとnever
という型ができます。
ts
typeNever = string & number;constType 'string' is not assignable to type 'never'.2322Type 'string' is not assignable to type 'never'.: n Never = "2";
ts
typeNever = string & number;constType 'string' is not assignable to type 'never'.2322Type 'string' is not assignable to type 'never'.: n Never = "2";
このnever
型にはいかなる値も代入できません。使い道がまるでないように見えますが意外なところで役に立ちます。今回は説明を省きます。
インターセクション型を使いこなす
システムの巨大化に伴い、受け付けたいパラメーターが巨大化したとします。
ts
typeParameter = {id : string;index ?: number;active : boolean;balance : number;photo ?: string;age ?: number;surname : string;givenName : string;company ?: string;phoneNumber ?: string;address ?: string;// ...};
ts
typeParameter = {id : string;index ?: number;active : boolean;balance : number;photo ?: string;age ?: number;surname : string;givenName : string;company ?: string;phoneNumber ?: string;address ?: string;// ...};
一見してどのプロパティが必須で、どのプロパティが選択可かが非常にわかりづらいです。これをインターセクション型とユーティリティ型のRequired<T>
とPartial<T>
を使いわかりやすく表記できます。ユーティリティ型については解説しているページがありますのでご覧ください。
📄️ Required<T>
全プロパティを必須にする
📄️ Partial<T>
全プロパティをオプショナルにする
必須とそうでないパラメータのタイプエイリアスに分離する
ts
typeMandatory = {id : string;active : boolean;balance : number;surname : string;givenName : string;};typeOptional = {index : number;photo : string;age : number;company : string;phoneNumber : string;address : string;};
ts
typeMandatory = {id : string;active : boolean;balance : number;surname : string;givenName : string;};typeOptional = {index : number;photo : string;age : number;company : string;phoneNumber : string;address : string;};
Required<T>, Partial<T>
をつける
Mandatory
はRequired<T>
を、Optional
はPartial<T>
をつけます。
ts
typeMandatory =Required <{id : string;active : boolean;balance : number;surname : string;givenName : string;}>;typeOptional =Partial <{index : number;photo : string;age : number;company : string;phoneNumber : string;address : string;}>;
ts
typeMandatory =Required <{id : string;active : boolean;balance : number;surname : string;givenName : string;}>;typeOptional =Partial <{index : number;photo : string;age : number;company : string;phoneNumber : string;address : string;}>;
インターセクション型で合成する
これで最初に定義したParameter
と同じタイプエイリアスができました。
ts
typeParameter =Mandatory &Optional ;
ts
typeParameter =Mandatory &Optional ;