[definite-assignment-assertions/显式赋值断言]typescript里!:是什么意思?

今天在一个ts代码示例里看到了如下语法:

baseDir!: string;

以前没有见过,因此查阅各种资料学习了一下。

严格的类初始化

ts2.7引入了一个新的flag:--strictPropertyInitialization。这个flag检查并确保一个类在初始化时,每一个属性都必须在构造器内初始化,或者在属性定义时赋予初始值。

官网的实例:

class C {
    foo: number;
    bar = "hello";
    baz: boolean;
//  ~~~
//  Error! Property 'baz' has no initializer and is not definitely assigned in the
//         constructor.

    constructor() {
        this.foo = 42;
    }
}

示例中,foo 通过构造器初始化了,bar 有初始值,baz 都没有,因此提示错误。

一种解决办法是把 foo 的类型改成 boolean | undefined,这个和本文无关。

另一种解决办法就是:

class C {
    foo!: number;
    // ^
    // Notice this '!' modifier.
    // This is the "definite assignment assertion"

    constructor() {
        this.initialize();
    }

    initialize() {
        this.foo = 0;
    }
}

这里用到了我们今天的主题 !:

简单的说,就是由用户自己保证,这个属性在使用前会初始化,类型检查不管这个属性了。

官方把这个属性称为 Definite Assignment Assertions,中文文档翻译为显式赋值断言。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值