最近,当用户尝试使用 getter/setter 对(属性访问增强)覆盖基类中的属性时,TypeScript 引入了编译错误:
class BaseClass {
prop : string = 'base_class'
}
class SubClass extends BaseClass {
_prop : string = 'sub_class'
/*
ERROR: 'prop' is defined as a property in class 'BaseClass', but is overridden here in 'SubClass' as an accessor.
*/
get prop () : string {
return this._prop
}
set prop (value : string) {
this._prop = value
}
}
// try running this snippet with `useDefineForClassFields : true` and `useDefineForClassFields : false`
console.log((new SubClass).prop)
此错误的动机是,在现代 JavaScript 中,类字段具有 [[DEFINE]] 语义,并且如果 useDefineForClassFields
编译器选项设置为
true
,上面的示例将无法按直观预期工作。属性访问增强模式
属性访问增强模式对于 SET 语义来说是完全有效的。这是非常惯用的 JavaScript。它的主要用例是在属性读/写时触发一些任意代码。这对于各种目的都非常有用,只需使用 getter/setter 访问器对覆盖基类的属性即可完成。
TypeScript 和 JavaScript 历史上对类字段使用 SET 语义。引入 DEFINE 语义后,TypeScript 添加了新的编译器配置
useDefineForClassFields
,它控制类字段的语义,并且默认情况下处于禁用状态,因为它是一个重大更改。
问题:
useDefineForClassFields=false
这是默认值)时,您认为属性访问增强模式是否有效并且应该受到 TypeScript 支持
constructor(protected override httpClient: HttpClient) {
super(httpClient);
}