为何用const声明两个变量并比较会报错?TypeScript技术疑问
TypeScript常量类型推断与比较报错问题解释
报错代码示例
const num1 = 10; const num2 = 20; if(num1===num2){ console.log("true") }
报错信息
Error: This comparison appears to be unintentional because the types '10' and '20' have no overlap.
添加类型注解后的可运行代码
const num1:number = 10; const num2:number = 20; if(num1===num2){ console.log("true") }
问题原因解释
- const的字面量类型推断:TypeScript对
const声明的变量会做精准的字面量类型推断——因为const变量的值不可修改,TypeScript会直接把它的类型定为具体的字面量值10和20,而非宽泛的number类型。两个完全不同的字面量类型用===比较时,TypeScript判定这种比较毫无意义(值永远不可能相等),所以抛出错误提示逻辑可能有误。 - 显式类型注解的作用:给
const变量加上:number注解后,相当于手动把变量类型从精准字面量拓宽为number类型。此时两个变量的类型一致,TypeScript认为它们存在值相等的可能性,因此不会报错。 - let声明不报错的原因:
let声明的变量可以被重新赋值,TypeScript会自动将其类型推断为宽泛的number类型(而非固定字面量),因为它的值存在变化可能。所以用let声明时,两个变量都是number类型,比较操作不会触发报错。
内容的提问来源于stack exchange,提问作者Zahir Khan
相关产品推荐
相关产品推荐

