Typescript 这应该是一个错误吗?
它应该编译吗? 它将未定义传递给此.g,但它需要一个数字Typescript 这应该是一个错误吗?,typescript,Typescript,它应该编译吗? 它将未定义传递给此.g,但它需要一个数字 class A { x: number | undefined; f() { this.x = 1; this.h(); this.g(this.x); } g(q: number) { } h() { this.x = undefined; } } 这是正确的,关于: 默认情况下,null和undefined是所有其他类型的子类型。那个 意味
class A {
x: number | undefined;
f() {
this.x = 1;
this.h();
this.g(this.x);
}
g(q: number) { }
h() { this.x = undefined; }
}
这是正确的,关于:
默认情况下,null和undefined是所有其他类型的子类型。那个
意味着您可以将null和undefined分配给number之类的对象
事实上,将x声明为数字|未定义或简单地声明为数字是等效的
更新:
正如@AlekseyL所指出的,可以通过将--stricnullchecks
编译器选项设置为true
()来改变这种行为
在严格的空检查模式下,空值和未定义值不在每种类型的域中,只能分配给它们自己和任何类型(一个例外是未定义值也可以分配给void)
这是正确的,关于:
默认情况下,null和undefined是所有其他类型的子类型。那个
意味着您可以将null和undefined分配给number之类的对象
事实上,将x声明为数字|未定义或简单地声明为数字是等效的
更新:
正如@AlekseyL所指出的,可以通过将--stricnullchecks
编译器选项设置为true
()来改变这种行为
在严格的空检查模式下,空值和未定义值不在每种类型的域中,只能分配给它们自己和任何类型(一个例外是未定义值也可以分配给void)
如果未启用strictNullChecks模式,则这是正确的。@AlekseyL。感谢您指出这一点,我已经更新了答案。不幸的是,即使使用strictNullChecks,在这种特定情况下,编译器也不会抛出错误,因为它无法推断(至少现在)在
h()
@AlekseyL中将值设置为undefined
。启用--stricnullchecks
后,编译器将在赋值this.x=undefined
上引发错误,不是吗?至少一个快速的检查可以证明这一点。如果你要定义x:number |未定义代码>如示例中所示,它不会。我们在这里查找错误this.g(this.x)
如果未启用strictNullChecks模式,则这是正确的。@AlekseyL。感谢您指出这一点,我已经更新了答案。不幸的是,即使使用strictNullChecks,在这种特定情况下,编译器也不会抛出错误,因为它无法推断(至少现在)在h()
@AlekseyL中将值设置为undefined
。启用--stricnullchecks
后,编译器将在赋值this.x=undefined
上引发错误,不是吗?至少一个快速的检查可以证明这一点。如果你要定义x:number |未定义代码>如示例中所示,它不会。我们在这里查找错误this.g(this.x)