generated at
[U] extends ..でdistributeを避ける


U 自体がUnion型でないと分配されない
U extends .. は、分配される
U[] extends .. は、分配されない
[U] extends .. は、分配されない

docsにも書いている


この仕様は、「意図的に、Union型を分配させたくない」という時に用いられる



例えばこんな型があるとき、
ts
type Dist<U> = U[] extends string[] | number[] ? true : false;
これ↓の結果は、 true か? false か?
ts
type R = Dist<string | number>; // true or false
以下の2パターン考えられる
もし分配されるなら true になるはず
ts
type R = Dist<string | number>; = string[] extends string[]|number[] ? true : false | number[] extends string[]|number[] ? true : false = true | true = true
分配されないなら false になるはず
ts
type R = Dist<string | number>; = (string|number)[] extends string[]|number[] ? true : false = false
実際は、 false になる
つまり、分配されない
[U] のときも同様






この知識が必要とされる型の実装例