3

私は学んTypeScriptでいて、次のクラスを持っています:

class DetailDriver {

    public get driver() {
        return super.getEntity();
    }

    public activate(): breeze.Promise {
        var id = this.driver.id(); // this refers to (class) DetailDriver

        return promise
            .then(getCertificate)
            .fail(somethingWrong);

        function getCertificate() {
            var id = this.driver.id(); // this refers to any
            return ...
        }
    }
}

上記のコードでわかるように、最初の呼び出しthisは my class を参照していDetailDriverます。それは良い。this(inside getCertificate)への 2 番目の呼び出しは、 を参照しanyます。それは私が必要とするものではありません。クラスを参照する必要がありDetailDriverます。

どうやって進める?

ありがとう。

4

3 に答える 3

8

良い、

TypeScript 言語仕様のセクション 4.9.2 によると、太い矢印構文を使用して、このスコープを維持する必要があります。

return promise
        .then(() => return.this.id;)
        .fail(somethingWrong);

次に、 this キーワードが Driver であると適切に判断されます。

于 2013-09-13T10:48:06.073 に答える
1

参考までに、次のこともできます。

class SomeClass {

    public someMethod() {
        // Do something
    }
    public anotherMethod() {
        var that = this; // Reference the class instance

        function someFunction () {
            that.someMethod();
        }
    }
}
于 2013-09-17T16:32:08.947 に答える
0

次のようにリファクタリングできます。

class DetailDriver {

    public get driver() {
        return super.getEntity();
    }

    public activate(): breeze.Promise {
        var id = this.driver.id(); // this refers to (class) DetailDriver

        return promise
            .then(this.getCertificate.bind(this)) // <- important part
            .fail(somethingWrong);
    }

    // new method function here
    private getCertificate() {
        var id = this.driver.id(); // this refers to any
        return ...
    }
}

functionクラス内の任意の場所でキーワードを使用すると、キーワードへのthis参照が外部クラスではなくその関数を参照するようになります。一般に、「太い矢印」構文を使用しない限り、クラス内で関数を定義することは避けたいと考えています。それは次のようになります。

class DetailDriver {

    public get driver() {
        return super.getEntity();
    }

    public activate(): breeze.Promise {
        var id = this.driver.id(); // this refers to (class) DetailDriver

        return promise
            .then(() => { // <- important part
                var id = this.driver.id(); // this refers to any
                return ...
            })
            .fail(somethingWrong);
    }
}
于 2016-09-21T18:06:55.563 に答える