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
相关产品推荐
相关产品推荐

