You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
  1. 泛型函数类型定义:

    • <T>() => T extends X ? 1 : 2:这是一个泛型函数类型,可接受任意类型T作为类型参数,返回值是条件类型:若T能赋值给X,返回类型1,否则返回类型2。
    • 右侧的<T>() => T extends Y ? 1 : 2是结构完全一致的泛型函数类型,仅将X替换为Y。
  2. 函数类型兼容性判断:
    TypeScript判断两个泛型函数类型是否兼容的规则是:对于所有可能的类型参数T,左侧函数的返回值类型必须能赋值给右侧函数的返回值类型。只要X和Y存在任何细微差异,就会存在某个T使得两个条件类型的返回值不同,导致函数类型不兼容。

  3. 最终结果转换:

    • 若两个泛型函数类型兼容(说明X和Y完全等价),第一个三元运算返回1,第二个三元运算返回true。
    • 若不兼容,第一个三元运算返回2,第二个三元运算返回false。

实例验证

实例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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:33:17