如何仅在子类中重写getter方法?解决重写后setter报错问题
子类仅重写getter导致属性赋值报错的解决办法
当你在子类里只重写了基类属性的getter却没重写setter时,JS/TS会默认这个属性只有getter,直接屏蔽掉基类里的setter实现。这是因为子类的属性描述符会覆盖基类的,只定义getter的话,引擎就会认为该属性没有setter,赋值时自然就抛出Cannot set property x of #<MyClass> which has only a getter的错误。
你贴的那个setter写法看起来冗余,但确实是必要的——它明确告诉引擎这个属性依然拥有setter,并且把赋值逻辑委托给基类的实现。写法可以直接用你给出的:
set x(val: any) { super.x = val; }
如果觉得这种重复写法不舒服,也可以把基类里的setter逻辑抽成一个独立方法(比如setX(val: any)),子类的setter直接调用这个方法,但本质上还是需要显式定义子类的setter来保留赋值能力。
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

