在属性声明中,"!"(感叹号符号)代表什么意思?

4
代码如下:
class Cat extends Animal { tag! : 'cat' }

在HTML标记声明后加上"!",代表这是一个注释的声明。与只有标记声明不同,它不会被浏览器解析为标记元素。

6
可能重复的问题:在 TypeScript 中,当取消引用成员时,感叹号(!)运算符是什么? - JoSSte
我不知道,依我看这不算是重复,因为感叹号作为运算符可以在你确定时移除“nullity”、“undefinity”,但在声明中,我不知道它是什么。 - RandomB
@r3dst0rm 在删除 "!" 后,class Cat extends Animal { tag : 'cat' } 声明中没有错误。 - RandomB
你的三种情况:第一种是简单地定义一个类型为 int 的属性标签。第二种使编译器对其在构造函数中未初始化的可能性保持沉默。第三种使属性变成可选的,因此可以是 int 或未定义。 - r3dst0rm
1
当然,由于代码不是一个完整的示例,我只添加了更多的代码,如Animal类/接口。https://codesandbox.io/s/k1i9q - r3dst0rm
显示剩余7条评论
1个回答

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

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

interface Animal {
    tag: string;
}

class Cat implements Animal { tag: 'cat' }

class AnimalClass {
    tag: string | undefined;
}

class Dog extends AnimalClass { tag: 'dog' }

这两个代码段都会报以下错误: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 = "";
    }
}

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html https://github.com/prettier/prettier/issues/3561 - Daniel Handojo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接