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

关于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;

接着我对这两个泛型函数做了自己的理解:

  1. 第一个函数:<T>() => T extends any ? 1 : 2 —— 不管T是什么类型,都会返回1,毕竟所有类型都继承自any嘛。
  2. 第二个函数:<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:47:59