为什么打字稿接受数字值作为类型?

时间:2017-11-02 13:11:10

标签: javascript angular typescript

我的Angular 4项目中有一个错误,我在其中声明了一个变量:

debounce: 300;

而不是

debounce = 300;

当然,在修复之前,这个.debounce是未定义的。

在这种情况下,不应该打字吗?

4 个答案:

答案 0 :(得分:17)

如果声明类型注释为300的变量,则表示不仅类型为数字,而且只能接受值300

var debounce: 300;

如果您尝试分配200:

,则会出现错误
debounce = 200;

启用严格的空检查,编译器将捕获此类问题(您打算分配值,而不是类型注释):

var debounce: 200;

// Strict null checks tells you here that you have done something strange
var x = debounce;

在这种情况下,当您尝试使用变量时,严格的空值检查指出您从未分配过一个值 - 因此告诉您您进行了注释,而不是赋值。

答案 1 :(得分:9)

你基本上可以将(几乎)任何值作为值类型传递给Typescript。所以如果你说:

class SomeClass {
  debounce: 300 | 500 | 700; 
  constructor() {
    this.debounce = 400;
  }
}

您将收到类型错误,因为打字稿期望去抖动的值为300500700,而不仅仅是任何数字。这意味着您可以更具体地了解类型注释。

答案 2 :(得分:1)

该行是正确的,因为您无意中使用了literal-typesfor more information):

example可帮助您了解literal-types如何用于将变量限制为一组有限的可能值

let zeroOrOne: 0 | 1;

zeroOrOne = 0;
// OK

zeroOrOne = 1; 
// OK

zeroOrOne = 2;
// Error: Type '2' is not assignable to type '0 | 1'

答案 3 :(得分:0)

不是一个常量声明。您已经认为声明了一个变量并分配了一个隐式键入的值。你错了。它是number类型声明,仅接受特定值。

debounce: 300;

然后用

指定它
this.debounce = 300;

Typescript不会给你一个错误,因为它在语法上是正确的,但undefined变量后面会出现运行时错误。