1
我试图编写一个memoize函数,它将一个函数作为参数并返回一个相似的memoized函数。返回相同函数类型的泛型memoize函数
function memoize<T extends Function, R>(f: T): T {
const memory = new Map<string, R>();
const g = (...args: any[]) => {
if (!memory.get(args.join())) { memory.set(args.join(), f(...args)); }
return memory.get(args.join());
};
return g; // g as T => [ts] Type '(...args: any[]) => R' cannot be converted to type 'T'.
}
// const exp: (...args: any[]) => RegExp
const exp = memoize<(text: string) => RegExp, RegExp>((text: string) => {
return new RegExp(text.replace(/[^a-zA-Z0-9\s]/g, ".").replace(/\s+/g, "\\s+"), "ig");
});
的问题是,如果我只是返回g
,exp的签名变得(...args: any[]) => RexExp
,如果我试图动力G为T,则ts
抱怨说,g是不能分配给T
。
有没有一种方法,以“迫使” g
是同一类型的f
到exp
有确切的同类型传递给memoize
的功能?
'args.join()'没有很好的一个关键:你必须为接受,因为,例如对象功能的问题,['}]。join()'和'[{foo:'bar'}]。join()'返回相同的值:''[object Object]''。仅仅使用'args'作为map key是没有好处的,因为map使用了严格的等式,所以'non-strict-equal'值会被多次记忆。 – artem
@artem感谢您的评论。你是对的,那不是一个好钥匙。它看起来像使用地图来构建树是更好的解决方案。 – Waterscroll