我正在用TypeScript编写一个(玩具)散列和缓存装饰器,找不到一个好的方法来创建一个可靠的通用装饰器。
到目前为止,我掌握的代码是
function cache
(target: Object,
propertyKey: string,
// Likely we can do better than <any> here -- <Function<any>> maybe?
descriptor: TypedPropertyDescriptor<any>)
{
let cacheMap = new Map();
let wrappedFn = descriptor.value;
descriptor.value = function (...args: any[]) {
if (cacheMap.has(args)) {
console.log("Short-circuiting with result: " + cacheMap.get(args));
return cacheMap.get(args);
}
let result = wrappedFn.apply(this, args);
cacheMap.set(args, result);
console.log("cacheMap %o", cacheMap);
return result;
}
return descriptor;
}当然,这是失败的,因为args不是元组,而是一个列表,即mutable1。因此,每个输入,即使一遍又一遍是相同的,在它自己的内存位置使用自己的散列值(无论来自何处)获取自己的列表/数组。
我还没有在TypeScript (或JS)中找到一个元组类型--有吗?这类问题还有别的解决办法吗?
Map<T, U>应该限制T实现IHashable或其他什么的,对吗?这就是类型的意义--在你的生活花费大量时间之前提出这个问题。发布于 2016-11-01 22:52:22
这难道不是一个错误吗?
Map<T, U>应该限制T实现IHashable或其他什么的,对吗?
不是的。在JavaScript中,对象标识是一个真正的、定义良好的东西;TypeScript并不试图强迫您假装它不存在。
如果ECMAScript委员会认为对地图实施非基于对象身份的键控是合适的,他们可以限制Map密钥,但他们没有。
https://stackoverflow.com/questions/40369631
复制相似问题