TypeScript接口:作为属性 - 或 - 在接口实现中

时间:2016-04-26 09:31:48

标签: function properties interface typescript

我的问题是接口中的函数和实现中的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被认为是类中的属性,但接口将其定义为方法。有道理。

那么如何解决这个问题呢?

1 个答案:

答案 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,似乎没问题 该类实现了接口,编译器不会抱怨。