[U] extends ..でdistributeを避ける
U
自体がUnion型でないと分配されない
U extends ..
は、分配される
U[] extends ..
は、分配されない
[U] extends ..
は、分配されない
この仕様は、「意図的に、Union型を分配させたくない」という時に用いられる
例えばこんな型があるとき、
tstype Dist<U> = U[] extends string[] | number[] ? true : false;
これ↓の結果は、 true
か? false
か?
tstype R = Dist<string | number>; // true or false
以下の2パターン考えられる
もし分配されるなら true
になるはず
tstype R = Dist<string | number>;
= string[] extends string[]|number[] ? true : false
| number[] extends string[]|number[] ? true : false
= true | true
= true
分配されないなら false
になるはず
tstype R = Dist<string | number>;
= (string|number)[] extends string[]|number[] ? true : false
= false
実際は、 false
になる
つまり、分配されない
[U]
のときも同様
この知識が必要とされる型の実装例