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

时间:2014-04-22 12:03:01

标签: 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.
  }
}

我收到错误消息:

  

只有基类的公共方法可以通过' super'   关键字。

@Basarat在这里提供了一些信息,但这似乎是对该语言的真正破解。 typescript arrow operator to define a function on prototype

如何在保留'这个'?的情境使用的同时做到这一点?

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

4 个答案:

答案 0 :(得分: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
    }
}

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

答案 1 :(得分:4)

  

箭头是否正常运行,或者它们是否真的只能用作声明回调之类的方法?

它们应该只用于回调。如果您想要一个类层次结构,那么使用原型。 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 
      }
  }

}

答案 2 :(得分:1)

如果原型中没有函数实现,派生类就无法“找到”基类实现。您可以将其分开,以便您有一种方法可以保留this,另一种方法可以通过super使用:

class BaseClass {
  count: number = 0;

  someMethodImpl() {
    this.count++;
  }

  public someMethod = this.someMethodImpl;
}

class ChildClass extends BaseClass {
  public someMethod = (): void=> {
    super.someMethodImpl();
    //Do more work here.
  }
}

答案 3 :(得分:0)

只想捕获一个"答案"来自另一个讨论的这个问题: https://typescript.codeplex.com/workitem/2491

在内存或处理开销方面绝对没有效率,但它确实回答了这个问题。

class Base {
    x = 0;
    constructor() {
        for (var p in this)
            if (!Object.prototype.hasOwnProperty.call(this, p) && typeof this[p] == 'function') {
                var method = this[p];
                this[p] = () => { method.apply(this, arguments); };
                // (make a prototype method bound to the instance)
            }
    }
}

class A extends Base {
    doSomething(value) { alert("A: " + value + " / x == " + this.x); }
}

class B extends A {
    doSomething(value) { alert("B: " + value + " / x == " + this.x ); super.doSomething(value); }
}

var b = new B();
var callback = b.doSomething;
callback("Cool!");