TypeScript 4.7.3中number与string相等比较触发ts(2367)报错咨询
报错触发原因
TypeScript 4.7版本强化了无重叠类型的比较校验逻辑:
- 静态类型层面,
number和string是完全没有交集的原始类型,TS判定这两类值做相等比较(不管是==还是===)属于无意义的逻辑错误,会直接抛出ts(2367)错误,提示该条件永远返回false。 - 这里需要注意:原生JS运行时
10 == '10'确实会触发隐式类型转换返回true,但TS的设计逻辑认为跨原始类型的宽松相等比较属于高风险写法,绝大多数场景是开发者漏写类型转换的手误,因此直接在编译阶段拦截。
解决方法
根据实际场景选择对应方案,优先推荐类型安全的写法:
- 显式统一两边的类型后再比较(推荐)
手动做类型转换,把两边值转为同类型后比较,完全符合TS类型安全要求,也避免隐式转换带来的不可预期问题:let a: number = 10; // 方案1:把字符串转为数字比较 let result = a == Number('10'); // 方案2:把数字转为字符串比较 // let result = String(a) == '10'; - 临时绕过类型检查(仅适合兼容遗留老代码,不推荐滥用)
如果确定要保留原宽松比较的写法,可以通过类型断言临时绕过TS校验:let a: number = 10; let result = a == ('10' as unknown as number); - 关闭编译校验规则(极度不推荐)
可以在tsconfig.json的compilerOptions中关闭严格类型检查相关配置(比如设置"strict": false),但这种做法会丢失TS绝大多数类型安全防护能力,非常容易引入线上问题,非极端兼容场景不要使用。
内容的提问来源于stack exchange,提问作者Vinod Pasi
相关产品推荐
相关产品推荐

