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

为何TypeScript推断Equal<boolean,boolean>为boolean而非true?

问题原因分析

核心背景

TypeScript 中 boolean 是 true | false 的内置联合类型别名,你定义的 Equal 类型会触发分布式条件类型机制——当条件类型中的泛型参数是「裸类型参数」(未被数组、对象等包裹的泛型参数)且为联合类型时,TypeScript 会将联合类型的每个成员单独代入条件判断,再合并所有分支的结果。

对 Equal<boolean, boolean> 的具体推断过程

  1. 由于 X 是裸类型参数且传入的是 boolean(即 true | false),分布式条件类型启动,将 X 拆分为 true 和 false 两个分支分别计算:
    • 分支1:X=true
      • 外层判断 true extends boolean:结果为 true,进入内层判断
      • 内层判断 boolean extends true:boolean 包含 false,false extends true 不成立,因此内层结果为 false,此分支最终返回 false
    • 分支2:X=false
      • 外层判断 false extends boolean:结果为 true,进入内层判断
      • 内层判断 boolean extends false:boolean 包含 true,true extends false 不成立,因此内层结果为 false,此分支最终返回 false
  2. 两个分支的结果合并为 false | false,理论上应简化为 false,若你看到推断结果为 boolean,大概率是误将类型提示中的字面量类型与联合类型混淆,或是代码中存在自定义覆盖 boolean 的干扰逻辑。

修复方案:阻止分布式条件类型

要让 Equal<boolean, boolean> 返回预期的 true,只需将泛型参数包裹在元组中,破坏裸类型参数的触发条件,避免联合类型的分布式拆分:

type Equal<X, Y> = [X] extends [Y] ? ([Y] extends [X] ? true : false) : false;

type Type1 = Equal<boolean, boolean>; // => true
type Type2 = Equal<boolean, string>;  // => false
type Type3 = Equal<string, string>;   // => true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:47:33