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

为什么TypeScript类型相等判断工具被包裹后行为出现异常?

原因解释

这个不一致的行为是由你所用的Equals/EqualsV2实现的底层依赖特性决定的:
这两个类型相等判断的实现,都依赖TypeScript编译器内部的条件类型同一性判定规则:当两个结构完全一致的条件类型进行可赋值性比较时,如果两者的入参完全固定且无未解析的泛型占位,TS会判定这两个条件类型是可赋值的,以此来间接判断两个类型相等。
当你把Equals封装到自定义泛型类型内部时,传给Equals的第一个参数是[Type1, Type2],其中包含未实例化的泛型参数占位。TS在计算泛型类型的返回值时,不会提前将泛型参数替换为实际传入的类型来做条件判定,而是会先保留泛型占位进行比较,此时因为存在未解析的泛型参数,TS无法判定两个条件类型完全相同,就会返回false。
而直接调用Equals或者通过ToTuple传入具体类型时,入参已经是完全解析的最终类型,没有泛型占位,判定规则可以正常触发,所以返回结果符合预期。这是TypeScript泛型延迟计算的固有设计,并非工具类型实现的bug。

解决方案

如果需要在泛型内部使用这两个相等判断,可以通过infer强制让TS先完全展开构造出的类型,再传入Equals做判定,示例如下:

// 改造后的TestFunction
type TestFunction<Type1, Type2> = [Type1, Type2] extends infer T ? Equals<T, [unknown, never]> : never
type test2 = TestFunction<unknown, never> // true,符合预期
// 改造后的TestFunction2
type TestFunction2<Type1, Type2> = [Type1, Type2] extends infer T ? EqualsV2<T, [unknown, never]> : never
type test5 = TestFunction2<unknown, never> // true,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:27:02