关于TypeScript泛型结构比较中Equal类型结果的困惑
关于TypeScript泛型结构比较中Equal类型结果的困惑
嘿,我最近折腾了一个TypeScript的小实验,想实现一个能判断两个类型是否相等的Equal类型,代码是这样的:
type Equal<X,Y> = (<T>()=> T extends X ? 1 : 2) extends (<T>()=> T extends Y ? 1 : 2) ? true : false; type Res = Equal<any, 1>; // type Res = false
我原本以为当判断Equal<any, 1>的时候,这个类型会被展开成下面这样:
type Equal<X,Y> = (<T>()=> T extends any ? 1 : 2) extends (<T>()=> T extends 1 ? 1 : 2) ? true : false;
接着我对这两个泛型函数做了自己的理解:
- 第一个函数:
<T>() => T extends any ? 1 : 2—— 不管T是什么类型,都会返回1,毕竟所有类型都继承自any嘛。 - 第二个函数:
<T>() => T extends 1 ? 1 : 2—— 只有当T是1的时候才返回1,其他情况都会返回2。
所以我当时琢磨着,第一个函数的类型应该等价于()=>1,第二个则等价于()=>1|2。但当我测试下面这段代码的时候,结果直接把我整懵了:
type FuncTest<F1, F2> = F1 extends F2 ? true : false; type Res = FuncTest<()=>1, ()=>1|2> // type Res = true
我本来以为返回类型是1的函数,应该没法赋值给返回类型是1|2的函数类型才对,可结果居然是true,这和我之前对Equal类型的理解完全冲突了,到底是哪里出问题了?
备注:内容来源于stack exchange,提问作者JaeHye0k
相关产品推荐
相关产品推荐

