我正在尝试在Map<K, V>
接口上编写一个简单的方法。这就是我迄今所做的:
MapExtensions.ts:
interface Map<K, V> {
clone(): Map<K, V>;
}
Map.prototype.clone = () => {
var self = this;
console.log(self);
let retval = new Map();
self.forEach((value, key) => {
retval.set(key, value);
});
//for (let [key, value] of self.entries()) {
// retval.set(key, value);
//}
return retval;
};
然而,在测试方法的过程中,我最终发现this
参数中的引用错误地引用了Window
个对象,因此,self.forEach
不起作用,而测试它的时候说self.forEach is not a function
(与self.entries()
相同)。这是我的测试脚本:
test("clone test", () => {
//Arrange
const source = new Map().set(1, "abc").set(2, "def").set(3, "ghi");
//Act
const actual = source.clone.bind(source)();//This fails.
//const actual = source.clone();//This too fails.
//Assert
console.log(actual);
console.log(expected);
deepEqual(actual, source, "Cloned correctly");
});
其他信息:
以下是生成的JavaScript输出:
var _this = this;//It seems this is causing the problem.
Map.prototype.clone = function () {
var self = _this;
var retval = new Map();
console.log(self);
self.forEach(function (value, key) {
retval.set(key, value);
});
return retval;
};
我使用的是Visual Studio 2015,以及typescript的默认JavaScript输出生成器。
如何成功完成这项工作?
答案 0 :(得分:2)
那是因为你正在使用箭头功能。当您需要访问this
时,请不要使用箭头功能。
Map.prototype.clone = function() { ... }