使用子类中的 getter/setter 对覆盖 JavaScript/TypeScript 基类中的属性是否有效?

问题描述 投票:0回答:1

最近,当用户尝试使用 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
,上面的示例将无法按直观预期工作

属性访问增强模式

需要注意的是,历史上没有人使用 DEFINE 语义来定义类属性。目前,世界上几乎所有 JavaScript 和 TypeScript 代码都采用类字段的 SET 语义。

属性访问增强模式对于 SET 语义来说是完全有效的。这是非常惯用的 JavaScript。它的主要用例是在属性读/写时触发一些任意代码。这对于各种目的都非常有用,只需使用 getter/setter 访问器对覆盖基类的属性即可完成。

TypeScript 和 JavaScript 历史上对类字段使用 SET 语义。引入 DEFINE 语义后,TypeScript 添加了新的编译器配置

useDefineForClassFields

,它控制类字段的语义,并且默认情况下处于禁用状态,因为它是一个重大更改。

问题:

    当类字段语义为 [[Set]](
  1. useDefineForClassFields=false
     这是默认值)时,您认为属性访问增强模式是否有效并且应该受到 TypeScript 支持
  2. 您在 JavaScript/TypeScript 代码库中使用此模式吗?如果是这样,请提供用法示例作为答案。
另请参阅:

建议将编译错误限制为仅定义语义

javascript typescript overriding getter setter
1个回答
0
投票
在某些情况下,我在扩展类中添加覆盖

constructor(protected override httpClient: HttpClient) { super(httpClient); }
    
© www.soinside.com 2019 - 2024. All rights reserved.