无法从子类访问抽象类的受保护属性

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

我无法使用 super 调用从具体类访问抽象类的服务属性,它只能与 this 一起使用。但是当我使用 super 时,打字稿不会显示任何类型错误

interface Service {
  do(): void;
}

abstract class Abstract {
  constructor(protected readonly service: Service) {}

  abstract execute(): void;
}

class Concrete extends Abstract {
  constructor(service: Service) {
    super(service);
  }

  execute(): void {
    super.service.do(); // <- if i replace "super" with "this", it works
  }
}

class ServiceImpl implements Service {
  do(): void {
    console.log("i saved something");
  }
}

const concrete = new Concrete(new ServiceImpl());

console.log(concrete.execute()); // <- it will throw error

此代码将抛出

TypeError: Cannot read properties of undefined (reading 'do')

我尝试使用 super 调用服务来提高代码的可读性,这样其他人就可以轻松地将 service 识别为抽象类的受保护成员。由于 Typescript 从超级调用中识别出service,通过类型检查器,我预计它会起作用,但事实并非如此

typescript oop
1个回答
0
投票

要访问类的受保护成员,您需要使用关键字

this
,如 TypeScript 文档中所示。

© www.soinside.com 2019 - 2024. All rights reserved.