“!” 是什么意思?(爆炸符号)在属性声明中意味着什么?

Pau*_*-AG 4 typescript

代码:

class Cat extends Animal { tag! : 'cat' }
Run Code Online (Sandbox Code Playgroud)

“!” 是什么意思?声明后的意思tag?它与只是有什么不同tag

r3d*_*0rm 5

让我们看一个例子 - 假设我们有以下代码:

interface Animal {
    tag: string;
}

class Cat implements Animal { tag: 'cat' }
Run Code Online (Sandbox Code Playgroud)
class AnimalClass {
    tag: string | undefined;
}

class Dog extends AnimalClass { tag: 'dog' }
Run Code Online (Sandbox Code Playgroud)

两个代码片段都会抛出以下内容:Property 'tag' has no initializer and is not definitely assigned in the constructor.(2564)

这是 TypeScript 在 2.7.2 中添加的一项功能,其中包括严格的类检查,所有属性都应在其构造函数内声明。

通过添加感叹号!,您将覆盖此行为并告诉编译器您“知道”,它正在正确初始化并且以后不会被取消定义。

您也可以通过"strictPropertyInitialization": false在编译器选项中设置来禁用它。或者你在应该初始化的地方初始化属性(根据 TypeScript):

class Dog extends AnimalClass { 
    tag: string;

    constructor() {
        super();
        this.tag = "";
    }
}
Run Code Online (Sandbox Code Playgroud)