union型をextendsしたときの関数型の挙動を調べる
from unionとtupleの変換
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と解釈するのは、理解できる
共変と不変あたりが関係してるぽい
https://qiita.com/tkrkt/items/ecd7884ec1156017b00f
https://www.typescriptlang.org/play?#code/C4TwDgpgBAkgdsCAnAPAVQHxQLxTVCAD0TgBMBnKOCAN2SgH4rb6AuKACgEMkBzdtAEocWanSQAoUJCgBBHFADes9gCIuqgL5Tw0AEILFetQCMtOmTACMC+IlTyAPlD0YL0GACZbCZCnkAZC5u7rCkEAjoWLj4RCQUzOKMiWwcwthYaBLZ0h7hCDa4MPnA-lDOrqHFEcDeRSVlQa5AA
なんとなくわかってきた
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をもうちょっと調べたが、内部の型を切り出すと挙動が変わって謎
https://www.typescriptlang.org/play?#code/C4TwDgpgBAggTgcwDwFUB8UC8UVQgD2AgDsATAZymIgDcI4oB+K2+qALigAoBDRTlAEosGanTgAoUJFhYoAbxicARD2UBfKeGgAhOfJ0qARhq0yAkgEY58ZDCgAfKDowB6V1E9de-WMMyirHDCTt58CJw6-oHigmbQ5gBMNohI9gBkzm4eXuGcGc7RLOISpdLQAEoQwKgY2LgERGSUYmzMrQzsXEUoZdpQ5qQkwNbYVTX2Ti5Q7gHc3EX2IfPdIs5QceUDQ8TAyWPVaVCZ07MYq3MFOn0yAGLEtgAqAPZIj3VQEp7fXl8-P48-v9hI0SBRuHkoABLYgAMzY5iKNGeUNIQP+TAG6P+nA6AG4btAABpye5PV5hXwwIodZaUiKFNa0tCEnDEKHPYgvcy7ejkCAAY2AHOItTkQK42NstSBIMIYMoPgZMPhDERa2RqOxzHM2NxQQJUC2AAlnggIABWOQodmc7m8uD8oUio5TDBfE1miAANmttq5zx5REdguFnKOJ3dHv6KEe5jeHzJiBeaVS7xZRpjcdGODjrqyQA