今天在一个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
,中文文档翻译为显式赋值断言。