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) が、世界中の他のすべてのプログラミング言語が行う方法ではなく、「これ」に関する奇妙な JavaScript ルールに従っていることです。User.sayHello() が RegisteredUser.sayHello() のオーバーライドから呼び出されると、インスタンス化された RegisteredUserオブジェクトではなくthisUserクラスがポイントされるため、実際にログに記録される内容は次のようになります。

Hello, undefined

これをこのようにするのは私には意味がないという事実を超えて ( https://typescript.codeplex.com/workitem/477を参照)、これを回避する最善の方法は何thisですか? () は、コールバックから呼び出されたときに正しいオブジェクトを指していますか?

4

3 に答える 3

1

これも機能し、変数の必要性を取り除きますs:

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

var s = super割り当てを避けてsuper.sayHello直接呼び出すと、TS がその魔法の呪文を挿入します。TS プレイグラウンドで試してみてください。

于 2012-11-29T15:59:12.023 に答える