如果我有这个:
class A {
a: string
}
然后 TypeScript 会告诉我
Property 'a' has no initializer and is not definitely assigned in the constructor.
引用该键可以消除错误:
class A {
'a': string
}
以我的理解引用和不引用没有区别。那么为什么会这样呢?
这种行为是故意的。根据 microsoft/TypeScript#20075,实现了
--strictPropertyInitialization
编译器选项的拉取请求:
严格的属性初始化检查仅适用于使用正确标识符声明的属性。它不适用于具有计算名称的属性或名称指定为字符串或数字文字的属性。
// Compile with --strict class Test { a: number; // Error, not initialized "hello world": number; // No check }
在类型
{a: string}
或值 {a: ""}
中,a
是一个 标识符,而在类型 {"a": string}
或值 {"a": ""}
中,"a"
是一个 字符串文字。所以前者会受到检查,而后者则不会。
为什么这样做的目的尚不清楚。在语言中的一些地方,括号访问(如计算属性)或字符串文字被免除检查,作为允许开发人员规避它们的一种方式,但显然不是每个人都同意这样的决定。