Typescript模块扩充 - 获取对实例的引用

时间:2017-01-01 20:26:14

标签: typescript

我理解如何进行模块扩充工作。但是,我不知道如何在新方法的实现中获得对象引用。

例如,我想扩充es2015 Map界面。

在我的代码中我有

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

工作正常。我可以在其他代码中看到新方法。

然而,当我尝试实现这个新方法时,我不知道如何获取Map实例的引用,所以我可以调用其他方法(例如get或keys)

我试过

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

但这不起作用。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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();
   ...
}

答案 1 :(得分:0)

改为使用普通功能。

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

箭头函数不仅仅是'酷炫的新函数语法',你应该有意识地做出有意识的决定,你希望箭头函数语义超过正常的函数语义。

主要箭头函数没有thisarguments的绑定,而是绑定到最近的词法范围。