Typescript 这应该是一个错误吗?

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是所有其他类型的子类型。那个 意味

它应该编译吗? 它将未定义传递给此.g,但它需要一个数字

class A {
    x: number | undefined;

    f() {
        this.x = 1;
        this.h();
        this.g(this.x);
    }

    g(q: number) { }

    h() { this.x = undefined; }
}
这是正确的,关于:

默认情况下,nullundefined是所有其他类型的子类型。那个 意味着您可以将nullundefined分配给number之类的对象

事实上,将x声明为数字|未定义或简单地声明为数字是等效的

更新:

正如@AlekseyL所指出的,可以通过将
--stricnullchecks
编译器选项设置为
true
()来改变这种行为

在严格的空检查模式下,空值和未定义值不在每种类型的域中,只能分配给它们自己和任何类型(一个例外是未定义值也可以分配给void)

这是正确的,关于:

默认情况下,nullundefined是所有其他类型的子类型。那个 意味着您可以将nullundefined分配给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)