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 没法推断进去,要通过赋值断言显示指定前面会为其初始化。