我的问题是接口中的函数和实现中的this
关键字。
假设以下情形:
我有一个实现特定接口的类。界面可以定义如下:
module Contracts
{
export interface ISomeInterface
{
Foo: () => void;
}
}
实施可能如下所示:
module MyClasses
{
export class SomeClass implements Contracts.ISomeInterface
{
public SomeValue: string = "Some fancy value";
public Foo()
{
alert(this.SomeValue);
}
}
}
当我从实例调用它时,这可以工作,如下所示:
var someClass = new MyClasses.SomeClass();
someClass.Foo();
现在,由于某些情况,函数不会像这样调用,而是在另一个上下文中调用,导致this
完全不同,导致this.SomeValue
未定义。
我已经了解到,当您想在另一个上下文中调用函数时正确访问this
时,您可以使用这样的胖箭头:
public Foo = () =>
{
alert(this.SomeValue);
}
(更多信息:https://github.com/Microsoft/TypeScript/wiki/%27this%27-in-TypeScript#use-instance-functions)
但这不满足界面。 Foo被认为是类中的属性,但接口将其定义为方法。有道理。
那么如何解决这个问题呢?
答案 0 :(得分:2)
最简单的方法是将绑定函数传递给回调(或其他)。
例如:
let a: SomeClass = new SomeClass();
let boundFoo = a.Foo.bind(a);
boundFoo(); // this should be as you intended
More about the bind
function in MDN
我检查了your code in Playground,似乎没问题 该类实现了接口,编译器不会抱怨。