ユニオン分配 (union distribution)
ユニオン分配はジェネリクスで使われる型変数Tに対しユニオン型が指定された場合、その各要素に対してジェネリクスの型変数を適用することを指します。
たとえば、次のような型エイリアスがあります。
tstypeIsString <T > =T extends string ? true : false;
tstypeIsString <T > =T extends string ? true : false;
この型を使ってstringとnumberのユニオン型を持つ変数Tに対してIsStringを適用すると、次のようになります。
tstypeA =IsString <string>;typeB =IsString <number>;typeC =IsString <string | number>;
tstypeA =IsString <string>;typeB =IsString <number>;typeC =IsString <string | number>;
IsString<T>にstring型を代入した型エイリアスAはtrueとなります。一方string型以外の型を代入した型エイリアスBはfalseとなります。
そしてstring | number型を代入した型エイリアスCはstring | number型としていっぺんに評価するのではなく、string型とnumber型が個別に評価されます。つまりCはIsString<string> | IsString<number>を評価していることと同じになり、結果としてtrue | falseが得られboolean型となります。
もしstring | number型がユニオン分配されずIsStringに適用されたとするとstring | number型はstring型の部分型ではないため、代入することができません。