为什么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
相关产品推荐
相关产品推荐

