2017-01-01 13 views
1

モジュールの拡張の仕方を理解しています。しかし、新しいメソッドの実装でオブジェクト参照を取得する方法はわかりません。Typescript module augmentation - インスタンスへの参照を取得する

たとえば、es2015マップインターフェイスを増やしたいとします。私は

declare global{ 
    interface Map<K, V> { 
     newMethod(g: K): V; 
    } 
} 

を持っている私のコードで

それは正常に動作します。私は他のコードで新しいメソッドを見ることができます。私はこの新しいメソッドを実装しようとすると、

しかし、私はMapインスタンスに参照を取得する方法がわからないので、私は(例えば取得またはキー)

を他のメソッドを呼び出すことができます私は

を試してみました
Map.prototype.newMethod = k => { 
    ... 
    let leys = this.keys(); 
    ... 
} 

しかし、それは動作しません。

どうすれば実現できますか?

答えて

1

プロトタイプにメソッドを追加するときに、矢印機能を使用することはできません。
このコード:

Map.prototype.newMethod = k => { 
    let leys = this.keys(); 
} 

がにコンパイル:

var _this = this; 
Map.prototype.newMethod = function (k) { 
    var leys = _this.keys(); 
}; 

そして、あなたが見ることができるように、_thisは、右のインスタンスを指していません。
それをes6にコンパイルしても、矢印の機能はそのまま維持されます。なぜなら、それは矢印の機能の仕組みだからです。

代わりに、それは次のようになります。

Map.prototype.newMethod = function(k) { 
    ... 
    let keys = this.keys(); 
    ... 
} 
+0

ああ、それは簡単でした。私は正常な機能と矢印機能の間にニュアンスがあることは知らなかった。 @Nitzanレッスンをありがとう! – daspr2

0

ではなく、通常の機能を使用してください。

Map.prototype.newMethod = function newMethod() { 
    let leys = this.keys(); 
}; 

アロー機能を使用すると、通常の関数のセマンティクスの上に矢印の機能のセマンティクスをしたい意図的な意識的な決定を行う必要があり、単に「クールな新しい関数の構文」ではありません。

主に矢印機能にはthisまたはargumentsのバインディングがありません。代わりに最も近いレキシカルスコープにバインドされます。

関連する問題