You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript继承时子类setter会覆盖父类继承的getter?是否为设计规范

问题解答

该现象是ECMAScript的标准设计

  • 类的getter/setter本质是挂载在原型对象上的属性描述符。当子类仅定义name属性的setter时,等于在Dad.prototype上重新定义了完整的name属性描述符,该描述符仅包含你编写的set逻辑,get属性默认取值为undefined。
  • 原型链的属性查找规则为:只要当前层级的对象/原型上存在对应属性的描述符,就不会继续向上查找父原型的同名属性。因此调用john.name时,会直接读取到子类描述符里值为undefined的getter,不会触发父类的getter逻辑。
  • setter赋值成功是因为子类的setter逻辑本身正确修改了_name属性,和getter查找失败的逻辑互不影响。

编译阶段未报错的原因

  • TypeScript没有强制要求访问器必须成对定义的规则:原生JavaScript本身就支持仅定义getter(实现只读属性)或仅定义setter(实现只写属性)的合法场景,TS无法默认判定子类仅覆写setter属于错误操作。
  • 目前TS的类型校验逻辑不会校验父类和子类同名访问器的配置匹配度,因此不会在编译期抛出相关提示。

修复方案

如果需要保留父类的getter逻辑,只需在子类中显式声明getter并复用父类实现即可:

class Dad extends Parent {
    get name() {
        return super.name;
    }
    set name(value: string) {
        this._name = value;
    }
    logName() {
        console.log(this._name);
    }
}

内容的提问来源于stack exchange,提问作者GGizmos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:45:00