TypeScript实现抽象类受保护成员报错及解决方法咨询
问题本质
你搞混了TypeScript里implements和extends的核心区别:
extends是继承,会建立类的父子关系,子类能继承父类的protected成员权限,这也是抽象类的设计初衷——作为基类被继承,强制子类实现抽象成员。implements只是实现契约,不管目标是类还是接口,它只要求当前类拥有目标类型的公共成员结构,不会建立继承关系,自然也不被允许访问或声明目标类的protected成员,因为protected的作用域仅限类的继承链内部。
解决办法
根据你的需求,有两种可行方案:
用
extends继承抽象类
这是TypeScript处理抽象类的标准方式,你的MyClassExt写法本身就是正确的,抽象类的设计逻辑就是作为基类被继承,子类通过继承获得protected成员的访问权限,同时实现抽象成员。把抽象类改成接口(如果不需要抽象类的其他特性)
如果你只是需要定义一个成员契约,不想建立继承关系,将抽象类改为接口更合适。接口的成员默认是public,用implements实现时,类可以自行决定成员的访问修饰符:
interface MyInterface { myMember: boolean } class MyClassImpl implements MyInterface { protected myMember: boolean constructor() { this.myMember = true } }
- (不推荐)将抽象类成员改为public
如果一定要保留抽象类+implements的组合,只能把protected abstract myMember改为public abstract myMember,但这会破坏protected的封装性,不建议使用这种方式。
内容的提问来源于stack exchange,提问作者henrique
相关产品推荐
相关产品推荐

