TypeScript 错误 - TS2340 公共方法可通过“super”关键字访问

Den*_*din 9 inheritance abstract-class typescript angular

我有一个很长的继承链,带有 Angular 5 中的抽象类和接口。它抛出了一个错误 error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword.

抽象父类的方法定义为:

public get text() {
    return this.el.attr('text/text').replace("\n", "");
} 
Run Code Online (Sandbox Code Playgroud)

子类的方法定义为:

public get text(): string {
  return super.text;
}
Run Code Online (Sandbox Code Playgroud)

如何让子类不抛出 TS2340 错误?

我创建了一个 stackblitz 来演示这个问题:

https://stackblitz.com/edit/ts2340-super-keywork-public?file=app%2Fnodes.ts

Sim*_*ver 13

这是一个糟糕的错误消息,但非常重要的是不要忽略它!

导致我出现此错误的代码如下:

跟踪器.ts

private _name: string;
public get name(): string { return this._name; }
public set name(name: string) { this._name = name; }
Run Code Online (Sandbox Code Playgroud)

SubTracker.ts(扩展跟踪器)

super.name = "Simon";   // seems innocuous enough right? 
Run Code Online (Sandbox Code Playgroud)

然后我得到了错误:

错误 TS2340:只能通过“super”关键字访问基类的公共和受保护方法。

事实证明,当您这样做时,super.name您实际上是在超类上覆盖实现本身。所以我才成功转换name成全局静态属性。然后在任何我可以访问的地方,我都会name得到我设置的最后一个值。


那么有什么解决办法呢?更改superthis

this.name = "Simon";
Run Code Online (Sandbox Code Playgroud)

所以不要忽略这个编译器错误!

  • 如果您实际上覆盖了 getter(如OP的问题),那么仅使用“this.”是行不通的,因为“this.name”将指向自身。您可以使用普通函数而不是 getter 或将编译目标更改为 ES6 (请参阅 @klugjo 的答案) (2认同)

klu*_*gjo 9

不幸的是,这不受 TS 支持,并且从它的外观来看,永远不会支持:

https://github.com/Microsoft/TypeScript/issues/338

看来目前让它工作的唯一方法是在编译器选项中针对 ES6

  • 这就是答案,无论如何我们大多数人都不再需要以 es5 为目标 - (3认同)