TypeScript条件类型中的泛型箭头函数:MyEqual逻辑解惑
详解TypeScript的MyEqual类型实现
核心逻辑:用泛型函数的兼容性判断类型全等
这个MyEqual类型的本质是通过泛型函数类型的兼容性检查,判断两个类型是否完全等价。TypeScript常规的extends判断是"赋值兼容"逻辑,无法识别像对象属性readonly这类细微差异,而泛型函数的特性可以精准捕捉这些区别。
拆解<T>的作用
这里的<T>是泛型函数类型的类型参数,它没有固定取值范围,可以代表任意类型。它的核心作用是创造一个"通用测试场景":让TypeScript检查,对于所有可能的类型T,T extends X ? 1 : 2和T extends Y ? 1 : 2的返回结果是否完全一致。只有当X和Y完全等价时,这两个条件类型的结果才会对所有T都相同,对应的泛型函数类型才会互相兼容。
逐行解析MyEqual代码
type MyEqual<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;
泛型函数类型定义:
<T>() => T extends X ? 1 : 2:这是一个泛型函数类型,可接受任意类型T作为类型参数,返回值是条件类型:若T能赋值给X,返回类型1,否则返回类型2。- 右侧的
<T>() => T extends Y ? 1 : 2是结构完全一致的泛型函数类型,仅将X替换为Y。
函数类型兼容性判断:
TypeScript判断两个泛型函数类型是否兼容的规则是:对于所有可能的类型参数T,左侧函数的返回值类型必须能赋值给右侧函数的返回值类型。只要X和Y存在任何细微差异,就会存在某个T使得两个条件类型的返回值不同,导致函数类型不兼容。最终结果转换:
- 若两个泛型函数类型兼容(说明X和Y完全等价),第一个三元运算返回
1,第二个三元运算返回true。 - 若不兼容,第一个三元运算返回
2,第二个三元运算返回false。
- 若两个泛型函数类型兼容(说明X和Y完全等价),第一个三元运算返回
实例验证
实例1:带readonly的对象对比
type test1 = MyEqual<{ bar: number }, { readonly bar: number }> // 结果:false
当T取{readonly bar: number}时:
- 左侧函数的
T extends X结果为false(带readonly属性的对象无法赋值给非readonly的对象类型),返回2。 - 右侧函数的
T extends Y结果为true,返回1。
此时左侧函数的返回值类型是1 | 2,右侧是1,左侧无法兼容右侧,最终返回false。
实例2:完全相同的对象对比
type test2 = MyEqual<{ bar: number }, { bar: number }> // 结果:true
对于任何类型T,T extends X和T extends Y的结果完全一致,两个泛型函数类型完全兼容,最终返回true。
内容的提问来源于stack exchange,提问作者stratis
相关产品推荐
相关产品推荐

