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

TypeScript条件类型不符合预期:为何工具类型始终返回boolean?

问题

我写了一个工具类型:

type Equals<T, R> = T extends R ? (R extends T ? true : false) : false;

后来调研发现,由于any类型的存在,TypeScript中的双向可赋值性与类型相等性并非同一概念,于是将其更名为:

type MutualAssignable<T, R> = T extends R ? (R extends T ? true : false) : false;

但这仍未解决核心问题:这个工具类型始终返回boolean类型,而非预期的true或false。我在TS 4.4.4、4.6.4和4.8.4版本中测试过,结果一致,且测试中发现结果始终会包含true分支,不符合预期。

解答

这是因为TypeScript的条件类型在处理未具体化的泛型参数时,不会提前解析出具体的true或false,而是会保留条件分支的联合结果——也就是true | false,等价于boolean类型。

举几个实际测试的例子:

  • 当传入明确的同类型:type TestSame = MutualAssignable<number, number>,TypeScript能直接判定双向可赋值,结果为true;
  • 当传入明确的不同类型:type TestDiff = MutualAssignable<number, string>,会直接返回false;
  • 但如果泛型参数是不确定的(比如在函数中定义function check<T, R>(a: T, b: R): MutualAssignable<T, R> { ... }),TypeScript在编译阶段无法确定T和R的具体类型,只能把两个分支的结果合并,最终返回boolean。

你提到的any类型影响的是双向可赋值性的判定逻辑(比如MutualAssignable<any, string>会返回true),但这和返回boolean的情况无关——只有当泛型参数未被具体类型替换时,才会出现返回boolean的现象。

内容的提问来源于stack exchange,提问作者DUAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33