12

给定

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 在这里提供了一些信息,但这似乎是对该语言的真正破解。 打字稿箭头运算符在原型上定义一个函数

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

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

4

4 回答 4

11

为了争论,假设你

  • 正在使用粗箭头语法,因为这些方法是由 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当您开始键入可继承方法的名称时,您通常会将该方法作为提示选项。

于 2015-08-23T18:47:03.467 回答
8

箭头函数是正确的,还是应该只用作声明回调之类的方法?

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

}
于 2014-04-22T13:00:58.937 回答
1

如果原型中没有函数实现,派生类就无法“找到”基类实现。您可以将其分开,以便您有一种保存方法this和另一种使用 via 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.
  }
}
于 2014-04-22T16:08:44.460 回答
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!");
于 2014-05-07T11:53:23.037 回答