打字稿|通过引用调用函数不起作用

时间:2019-08-25 11:31:00

标签: typescript

我试图通过引用调用一个函数。一切都始于类callMe()的{​​{1}}:

DynamicCalls

我希望第三个通话interface IDynamicFunction { name: string; func: (param: string) => void; } class DynamicCalls { private dynamicCall: IDynamicFunction = { name: "myDynamic", func: this.testFunc }; public callMe() { this.callFromDynamic("Works"); // 1st -> Works this.testFunc("Works, also"); // 2nd -> Works this.dynamicCall.func("First Call"); // 3rd -> Error: callFromDynamic seems to be unknown in testFunc } private callFromDynamic(param: string): void { console.log("Param: " + param); } private testFunc(param: string): void { console.log("Param: " + param); this.callFromDynamic("Second call"); // Gives error -> TypeError: this.callFromDynamic is not a function } } let dynamicCalls: DynamicCalls = new DynamicCalls(); dynamicCalls.callMe(); 的工作方式像(this.dynamicCall.func("First Call");)

有人可以向我解释为什么我得到这个this.testFunc("Works, also")吗?以及如何避免呢?

非常感谢。

亲切的问候, 奥基恩

2 个答案:

答案 0 :(得分:2)

问题是您丢失了上下文。

在您的情况下,this指向同一对象:{name: string, func: Function}

因此您可以使用:

private dynamicCall: IDynamicFunction = {
  name: "myDynamic",
  anotherFun: () => console.log('another func'),
  func: this.anotherFun()
};

尝试:

private dynamicCall: IDynamicFunction = {
  name: "myDynamic",
  func: (param: string) => this.testFunc(param)
};

答案 1 :(得分:0)

@MaximP是正确的,但是还有另一种解决方案。

    private callFromDynamic = (param: string): void => {
        console.log("Param: " + param);
    };

    private testFunc = (param: string): void => {
        console.log("Param: " + param);
        this.callFromDynamic("Second call");
    };

将您的函数更改为字段,现在它们将保留其上下文,而无需包装其调用。