在 TypeScript 中从子类中的回调调用超类方法时出错"this"



我有一些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)遵循关于"这个"的奇怪的JavaScript规则,而不是像世界上其他编程语言那样做。因此,当从 RegisterUser.sayHello() 中的覆盖调用 User.sayHello() 时,this指向 User 而不是实例化的 RegisterUser 对象,因此实际记录的内容是:

Hello, undefined
除了这样做对我来说

没有任何意义这一事实(见 https://typescript.codeplex.com/workitem/477),解决此问题的最佳方法是什么,以便 User.sayHello() 中的this在从回调调用时指向正确的对象?

好的,这有效:

setTimeout(() => s.sayHello.call(this), 1000);

这也有效,并且摆脱了对s var 的需求:

sayHello(): void {
    setTimeout(super.sayHello.bind(this), 1000);
}

如果你避开var s = super作业,直接呼唤super.sayHello,TS会为你插入那个魔法咒语。在 TS 游乐场尝试一下。

最新更新