1. 赋值断言

  • 类属性应用赋值断言

官网示例:

class C {  foo!: number;  // ^  // Notice this exclamation point!  // This is the "definite assignment assertion" modifier.  constructor() {    this.initialize();  }  initialize() {    this.foo = 0;  }}

如果去掉foo前面的感叹号会怎么?

报错提醒咱们foo没有初始化,也没有在构造函数中定义;意思就是在构造函数中初始化就不会报错了?

在构造函数中初始化确实不报错,反向证实报错信息很精确。

  • 变量申明应用赋值断言

官网示例

let x!: number[];initialize();x.push(4);function initialize() {  x = [0, 1, 2, 3];}

去掉感叹号

报错信息通知咱们变量x在被赋值之前应用了。

提醒:

下面的报错信息都是建设在tsconfig.json设置strict:true的前提下,
在不应用赋值断言的前提下:

strictPropertyInitializationstrict变量类属性
falsetrue报错不报错
falsefalse不报错不报错
truefalse不报错报错
truetrue报错报错

strictPropertyInitialization的粒度更细,变量没有初始化导致报错没有更细粒度的参数去配置。

小结:对于提早初始化,typescript没法推断进去,要通过赋值断言显示指定前面会为其初始化。