Typescript:如何在子类中使用super关键字调用基类中使用箭头函数定义的方法?

Ric*_*tte 10 typescript arrow-functions

特定

class BaseClass{

  count:number=0;

  public someMethod=():void =>{
      this.count++;
  }
}

class ChildClass extends BaseClass{
  public someMethod=():void=>{
     super.someMethod();
     //Do more work here.
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

只能通过'super'关键字访问基类的公共方法.

@Basarat在这里提供了一些信息,但这似乎是对该语言的真正破解. typescript箭头操作符在原型上定义函数

如何在保留"this"的上下文使用的同时做到这一点?

我是否正确使用箭头函数或者它们是否真的只能用作声明回调之类的方法?

cla*_*ond 9

为了争论,假设你

  • 正在使用fat-arrow语法,因为这些方法是由UI事件或回调触发的(在我的情况下是敲除点击事件)
  • 需要继承来消除UI(或回调)响应代码中的冗余.

最简单的hackish(如果不是优雅)答案是将您的函数分成两个调用来解决这两个问题:

Class A {
    public handleScope = () => {
        return this.handleInheritance();
    }

    public handleInheritance() {
        // do work
    }
}

Class B extends A {
    public handleInheritance() {
         super.handleInheritance() // super works here
         // additional work
    }
}
Run Code Online (Sandbox Code Playgroud)

我是第一个承认双重功能是"丑陋"的人,但恕我直言比我见过的其他选项要难得多.为了帮助标准化命名,我将单行"范围"函数命名为基函数的名称(例如myFunction)加上"Scoper"(即myFunctionScoper).这也是IDE友好的,因为Scoper当您开始为可继承方法键入名称时,您通常会将该方法作为提示选项.


bas*_*rat 5

箭头功能正常还是应该仅将其用作声明回调之类的方法?

它们实际上仅应用于回调。如果需要类层次结构,请使用原型。prototype还可以节省您的记忆。

强制修复:只有一个this,它是当前实例。如果覆盖 this.foo子类,则基本实例this.foo将丢失。在构造函数中保留基本版本

class BaseClass{

  count:number=0;

  public someMethod=():void =>{
      this.count++;
  }
}

class ChildClass extends BaseClass{

  constructor(){      
      super();
      var baseSomeMethod = this.someMethod;
      this.someMethod = ()=>{
          // implement here 
      }
  }

}
Run Code Online (Sandbox Code Playgroud)