我构建了一个更高阶的函数,如果使用相同的参数调用该函数,该函数将缓存该函数的结果.这是使用Parameters实用程序类型返回具有相同签名的函数,并将参数传递给包装函数.
function memoize<FN extends (...args: any) => Promise<any>>(fn: FN) {
const cache: Record<string, Promise<Awaited<ReturnType<FN>>>> = {};
return (...args: Parameters<FN>) => {
const cacheKey = JSON.stringify(args);
if (!(cacheKey in cache)) {
// @ts-ignore
const promise = fn(...args);
cache[cacheKey] = promise;
}
return cache[cacheKey];
};
}
如果没有ts-ignore
份Typescript ,Type 'Parameters<FN>' must have a '[Symbol.iterator]()' method that returns an iterator. ts(2488)
份Typescript 将会失败.我如何正确地解决这个问题?
该函数的用法如下:
const cachedFunction = memoize(async (id: string) => fetch(`https://jsonplaceholder.typicode.com/todos/${id}`))
const resultFromAPI = cachedFunction("1")
const resultFromCache = cachedFunction("1")