memo()
題目: 近似於 React.memo
如果帶入相同的參數則不重新計算結果
const func = (arg1, arg2) => {
return arg1 + arg2
}
const memoed = memo(func)
memoed(1, 2)
// 3, func is called
memoed(1, 2)
// 3 is returned right away without calling func
function memo<T extends (...args: any[]) => any>(func: T, resolver?: (...args: Parameters<T>) => string): T {
// your code here
let map = new Map<string, any>()
function resolve (args: Parameters<T>): string {
if(resolver === undefined) {
return args.toString()
}
return resolver(...args)
}
const memoizedFunc = function(this: any, ...args: Parameters<T>): ReturnType<T> {
if(map.has(resolve(args))) {
return map.get(resolve(args))
} else {
const value = func.call(this, ...args)
map.set(resolve(args), value)
return value;
}
}
return memoizedFunc as T;
}
Last updated