表达式1==2
会导致TypeScript提供错误Operator '==' cannot be applied to types '1' and '2'
。 TypeScript将这些值视为不同类型的原因是什么(typeof
运算符,而且可预测地说,它们都是number
s)?是否将设计决定专门应用于数字或整体打字系统的副产品?允许比较文字可能造成什么危害?
答案 0 :(得分:7)
1
和2
被视为所谓的文字数字。这意味着值1
的类型为1
,因此只能1
,与2
相同。鉴于此,1==2
的表达没有意义,因为1
永远不会是2
,或者更准确地说它们的类型不匹配,您可以将苹果与橙子进行比较
以下是默认情况下假定文字类型的基本原理和深度细节:
关于文字类型:
为什么文字类型有用的许多例子之一:
答案 1 :(得分:5)
当TypeScript对表达式1
执行类型推断时,它会为其指定类型1
,而不是类型number
。如果你检查这样的代码,你可以看到这个:
const a = 1;
如果您使用IDE查询a
的推断类型,您会看到a的类型为1
。例如,在TypeScript playground中,您会收到一个显示const a: 1
的工具提示。
因此,在if (1 == 2)
中,1
的类型为1
,2
的类型为2
。 TypeScript不允许您比较它们,因为它们具有不同的推断类型。这是TypeScript为您提供的类型安全的一部分。
你可以解决它:
if (1 as number == 2) {
}
您在评论中提到您正在进行1 == 2
比较,因为编译器抱怨无法访问的代码而无法执行if (false) { ... }
。我可以解决这个问题:
if (false as boolean) {
console.log("something");
}
答案 2 :(得分:4)
Typescript可以从任何常量值创建一个类型。当与union类型结合使用时,会创建一种非常强大的方式来表达函数作为参数所用的内容,例如:
function doStuff(p : "yes"| 1| true| "no"| 0| false ){
}
doStuff("maybe"); //Error
doStuff(3); // Error
doStuff(1) ; //OK
您遇到了令人遗憾的副作用,例如您的错误而不是expression is always false
报告会转变为类型兼容性错误。