为什么TypeScript认为每个数字都是自己的类型?

时间:2017-08-31 11:27:49

标签: javascript typescript types

表达式1==2会导致TypeScript提供错误Operator '==' cannot be applied to types '1' and '2'。 TypeScript将这些值视为不同类型的原因是什么(typeof运算符,而且可预测地说,它们都是number s)?是否将设计决定专门应用于数字或整体打字系统的副产品?允许比较文字可能造成什么危害?

3 个答案:

答案 0 :(得分:7)

在此上下文中,

12被视为所谓的文字数字。这意味着值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的类型为12的类型为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报告会转变为类型兼容性错误。