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的前提下,
在不应用赋值断言的前提下:
strictPropertyInitialization | strict | 变量 | 类属性 |
---|---|---|---|
false | true | 报错 | 不报错 |
false | false | 不报错 | 不报错 |
true | false | 不报错 | 报错 |
true | true | 报错 | 报错 |
strictPropertyInitialization的粒度更细,变量没有初始化导致报错没有更细粒度的参数去配置。
小结:对于提早初始化,typescript没法推断进去,要通过赋值断言显示指定前面会为其初始化。