TypeScript条件类型中如何实现严格类型检查,避免any返回联合类型
问题根因
你原代码的条件类型遇到any时会触发TS的特殊处理:any extends 任意类型的判断会同时命中true和false两个分支,最终返回两个分支结果的联合类型,所以你才会得到'false' | 'true'的结果。
解决方案
TS中可以通过泛型函数的类型对比实现类似JS===的严格类型相等判断,具体实现如下:
// 严格类型相等判断工具,效果等同于类型层面的 === type Equals<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false; // 改造你的工具类型 type isFalseAndNotAny<T> = Equals<T, false> extends true ? 'false' : 'true'; // 测试结果符合预期 type A = isFalseAndNotAny<any>; // 类型为 'true' type B = isFalseAndNotAny<false>; // 类型为 'false'
工具特性
这个Equals工具可以正确处理所有特殊类型的严格比对,不会出现普通extends关键字的兼容判定问题:
- 可以区分
any、never、unknown三种特殊类型 - 仅当两个类型完全一致时才返回
true,不会把子类型、兼容类型判定为相等 - 可以正确区分联合类型、交叉类型的差异
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

