最近,TypeScript引入了编译错误 https://github.com/microsoft/TypeScript/pull/37894,当用户尝试使用 getter/setter 对覆盖基类中的属性时(属性访问增强):
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]] 语义,并且上面的示例不会按直觉预期工作 https://github.com/microsoft/TypeScript/pull/37894#issuecomment-862533006 if useDefineForClassFields
编译器选项设置为true
.
属性访问增强模式
需要注意的是,历史上没有人对类属性使用 DEFINE 语义。目前,世界上几乎所有 JavaScript 和 TypeScript 代码都采用类字段的 SET 语义。
属性访问增强模式对于 SET 语义来说是完全有效的。这是非常惯用的 JavaScript。它的主要用例是在属性读/写时触发一些任意代码。这对于各种目的都非常有用,只需使用 getter/setter 访问器对覆盖基类的属性即可完成。
TypeScript 和 JavaScript 历史上对类字段使用 SET 语义。引入 DEFINE 语义后,TypeScript 添加了新的编译器配置,useDefineForClassFields
,它控制类字段的语义,默认情况下处于禁用状态,因为它是一个重大更改。
问题:
- 当类字段语义为 [[Set]] 时,您认为属性访问增强模式是否有效并且应该受到 TypeScript 支持(
useDefineForClassFields=false
这是默认值)
- 您在 JavaScript/TypeScript 代码库中使用此模式吗?如果是这样,请提供用法示例作为答案。
也可以看看:建议将编译错误限制为仅定义语义 https://github.com/microsoft/TypeScript/issues/44927
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)