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