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

clb*_*clb 9 javascript types typescript

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

Tri*_*Gao 7

12在这种情况下被认为是所谓的面值数字.这意味着值1具有类型1,因此只能1与...相同2.鉴于此,表达1==2没有意义,因为1永远不会2,或者更确切地说,它们的类型不匹配,你无法将苹果与橙子进行比较.

以下是默认情况下假定文字类型的基本原理和深入细节:

关于文字类型:

关于为什么文字类型有用的许多例子之一:


Lou*_*uis 5

当TypeScript对表达式进行类型推断时1,它会为其提供类型1,而不是类型number.如果你检查这样的代码,你可以看到这个:

const a = 1;
Run Code Online (Sandbox Code Playgroud)

如果您使用IDE查询推断类型a,您将看到a的类型1.例如,在TypeScript游乐场中,您会看到一个工具提示const a: 1.

所以在if (1 == 2),1有类型12类型2.TypeScript不允许您比较它们,因为它们具有不同的推断类型.这是TypeScript为您提供的类型安全的一部分.

可以解决它:

if (1 as number == 2) {
}
Run Code Online (Sandbox Code Playgroud)

并且您在评论中提到您正在进行1 == 2比较,因为您无法做到,if (false) { ... }因为编译器抱怨无法访问的代码.我可以解决这个问题:

if (false as boolean) {
    console.log("something");
}
Run Code Online (Sandbox Code Playgroud)