union型をextendsしたときの関数型の挙動を調べる
union型をextendsしたときの関数型の挙動を調べる
このU extends never ? never : (arg: U)=>neverのおかげで、交差型になっている?
https://gyazo.com/40183930fe5f5c76e5b8ee766d5fd2a6
(arg: string | number)=>neverじゃないんだ
なるほどね
extendsかませるとunionを分解して関数の引数に渡せるのか
この(Fn1 | Fn2)みたいな型をinferで引数を取ると交差になるのか
これどういうことだ?
string or numberを引数に取る関数を、(string)=>unknown or (number)=>unknownと解釈するのは、理解できる
なんとなくわかってきた
extendsというのは部分集合であるのかどうかを判定するので、extendsの左辺にunionが来たときは、unionごとの判定をするのだろう
code:ts
type Ret<U> = U extends never ? never :() => U
type Ident1 = Ret<A | B> //=> ( () => A ) | ( () => B )
type Ident2 = Ret<A & B> //=> () => A & B
union型のときはひとつずつ渡して、判定して、最後にunionを取り直すのだろう
そう考えると、こちらの場合の挙動も仮定と一致する
code:ts
type I1 = Arg<A | B> // ((arg: A) => never) | ((arg: B) => never)
type I2 = Arg<A & B> // (arg: A & B) => never
UnionsToIntersectionをもうちょっと調べたが、内部の型を切り出すと挙動が変わって謎