表达式1==2会导致TypeScript给出错误Operator '==' cannot be applied to types '1' and '2'。TypeScript将这些值视为不同类型的原因是什么(不出所料,typeof运算符会说它们都是number)?这是一个专门应用于数字的设计决定,还是整个打字系统的副产品?允许字面量的比较会造成什么危害?
发布于 2017-08-31 19:35:08
在这种情况下,1和2被认为是所谓的文字数字。这意味着值1的类型为1,因此只能为1,与2相同。鉴于此,1==2的表达式没有意义,因为1永远不可能是2,或者更准确地说,它们的类型不匹配,您不能将苹果与橙子进行比较。
以下是默认情况下假设文本类型的基本原理和深入细节:
关于文字类型:
解释为什么文本类型很有用的众多示例之一:
发布于 2017-08-31 19:49:03
当TypeScript在表达式1上执行类型推断时,它会给它类型1,而不是number类型。如果你像这样检查代码,你会发现:
const a = 1;如果您使用集成开发环境查询推断出的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");
}发布于 2017-08-31 19:45:02
Typescript可以从任何常量值创建类型。当与联合类型结合使用时,这将创建一种非常强大的方式来表达函数作为参数的内容,例如:
function doStuff(p : "yes"| 1| true| "no"| 0| false ){
}
doStuff("maybe"); //Error
doStuff(3); // Error
doStuff(1) ; //OK您正在经历一个不幸的副作用:像您这样的错误不是被报告为expression is always false,而是转变为类型兼容性错误。
https://stackoverflow.com/questions/45980370
复制相似问题