一个Typed函数数组 - 使用此引用

时间:2017-11-07 13:41:48

标签: typescript

我正在尝试创建一个接口,用于定义具有一系列函数的接口和一个这样的防护,如下所示:

interface MyInterface {
  myFunctions: ((this:MyInterface, somevar: string): void)[];
}

但是,当我尝试使用它如下:

class Myclass implements MyInterface {
  myFunctions: ((this:Implementation, somevar: string): void)[];
  useFunction (): void {
    this.myFunctions[0](somevar);
  }
}

下面的错误发生了     类'Myclass'错误地实现了接口'MyInterface'

有人知道我是如何实现的?

1 个答案:

答案 0 :(得分:1)

首先,函数类型使用=>声明,而不是:

interface MyInterface {
  myFunctions: ((this:MyInterface, somevar: string) => void)[];
}

其次,为什么课程中有this:Implementation,而不是界面中声明的this.MyClassthis.MyInterface?它应该是一致的 - 在类和接口中都是this.Implementation,在接口中是this.MyInterface,在类中是this.MyClass

然后,在javascript(和typescript)中,为了调用函数并设置它的this上下文,函数名必须紧跟(,例如this.useFunction()

您有this.myFunctions[0](somevar)这意味着您正在调用myFunctions的第一个元素作为自由函数,而不设置其this上下文。您需要在此处使用call()明确设置this

interface MyInterface {
  myFunctions: ((this:MyInterface, somevar: string) => void)[];
}

class Myclass implements MyInterface {
    myFunctions: ((this: Myclass, somevar: string) => void)[] = [];


    useFunction(somevar: any): void {
        this.myFunctions[0].call(this, somevar);
    }

}