我的Angular 4项目中有一个错误,我在其中声明了一个变量:
debounce: 300;
而不是
debounce = 300;
当然,在修复之前,这个.debounce是未定义的。
在这种情况下,不应该打字吗?
答案 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;
}
}
您将收到类型错误,因为打字稿期望去抖动的值为300
,500
或700
,而不仅仅是任何数字。这意味着您可以更具体地了解类型注释。
答案 2 :(得分:1)
该行是正确的,因为您无意中使用了literal-types
(for 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
变量后面会出现运行时错误。