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
这是一个糟糕的错误消息,但非常重要的是不要忽略它!
导致我出现此错误的代码如下:
private _name: string;
public get name(): string { return this._name; }
public set name(name: string) { this._name = name; }
Run Code Online (Sandbox Code Playgroud)
super.name = "Simon"; // seems innocuous enough right?
Run Code Online (Sandbox Code Playgroud)
然后我得到了错误:
错误 TS2340:只能通过“super”关键字访问基类的公共和受保护方法。
事实证明,当您这样做时,super.name您实际上是在超类上覆盖实现本身。所以我才成功转换name成全局静态属性。然后在任何我可以访问的地方,我都会name得到我设置的最后一个值。
super为this:this.name = "Simon";
Run Code Online (Sandbox Code Playgroud)
所以不要忽略这个编译器错误!
不幸的是,这不受 TS 支持,并且从它的外观来看,永远不会支持:
https://github.com/Microsoft/TypeScript/issues/338
看来目前让它工作的唯一方法是在编译器选项中针对 ES6
| 归档时间: |
|
| 查看次数: |
5131 次 |
| 最近记录: |