2

我有一些 TypeScript 代码(实际上)看起来像这样:

class User {
    name: string = "Bob";
    sayHello(): void {
        console.log("Hello, " + this.name);
    }
}

class RegisteredUser extends User {
    name: string = "Frank";
    sayHello(): void {
        var s = super;
        setTimeout(() => s.sayHello(), 1000);
    }
}

var registeredUser = new RegisteredUser();
registeredUser.sayHello();

问题是 TypeScript(莫名其妙地,IMO)遵循关于“this”的奇怪的 JavaScript 规则,而不是像世界上所有其他编程语言那样做。因此,当从 RegisteredUser.sayHello() 中的覆盖调用 User.sayHello() 时,this指向 User而不是实例化的 RegisteredUser对象,因此实际记录的是:

Hello, undefined

除了这对我来说这样做没有任何意义(请参阅https://typescript.codeplex.com/workitem/477)之外,解决此问题的最佳方法是什么,以便this在 User.sayHello () 从回调调用时指向正确的对象?

4

3 回答 3

2

好的,这有效:

setTimeout(() => s.sayHello.call(this), 1000);
于 2012-11-29T01:10:15.080 回答
1

这也有效并消除了对svar 的需要:

sayHello(): void {
    setTimeout(super.sayHello.bind(this), 1000);
}
于 2012-12-06T21:27:04.267 回答
0

如果你避免var s = super分配,super.sayHello直接调用,TS会为你插入那个魔法咒语。在 TS Playground 中尝试一下。

于 2012-11-29T15:59:12.023 回答