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