错了"这个"从TypeScript中的子类中的回调调用超类方法时

时间:2012-11-29 01:01:59

标签: typescript

我有一些(有效)看起来像这样的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),解决这个问题的最佳方法是什么,以便在User.sayHello中this ()从回调调用时指向正确的对象?

3 个答案:

答案 0 :(得分:2)

好的,这有效:

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

答案 1 :(得分:1)

这也有效,并且不需要s var:

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

答案 2 :(得分:0)

如果您避免var s = super分配,并直接致电super.sayHello,TS会为您插入该魔法咒语。在TS游乐场试试。