Open3

TSで型パラメータにユニオン型を取るジェネリクスを作る時に、ユニオンをいい感じにする (Distributive Conditional Type)

nakaakistnakaakist

例えば、下記のようなToArray型を作ったとする。

type ToArray<T> = T[];

この型に対し、ToArray<string | number>とすると、

(string | number)[]

と解釈されてしまう。

string[] | number[]

にしたいときはどうするのか?
つまり、ToArrayを、型パラメータのUnionに対し、分配的に適用するにはどうすればいいか?

nakaakistnakaakist
type ToArray<Type> = Type extends any ? Type[] : never;

のように、一見無意味に見えるconditional typeを挟むことによって、ToArray<string | number>

string[] | number[]

と解釈される。この振る舞いを指して、When conditional types act on a generic type, they become distributive when given a union type. と説明がされている