我正在尝试实现一个小型缓存功能。虽然我的实现似乎有效,但我很难在其中定义正确的类型。
type Producer<T> = (...args: any[]) => Promise<T>;
export function cache<T>(producer: Producer<T>): Producer<T> {
let cached;
return async function(...args: any[]): Promise<T> {
if (!cached) {
cached = await producer.apply(null, args);
}
return cached;
};
}
是的,我仍然需要改进它,以便根据传递的参数缓存该值,但这是一个小且易于修复的问题。
在这种情况下,a Producer
是一个可以生成可缓存值的函数,并且只能被调用一次。 cache()
返回一个函数,该函数应该具有与传递给 cache()
函数的生产者匹配的参数。现在,如果您知道要传递哪些参数,那么现在就可以正常工作,但这是 TypeScript,所以我希望编译器能够验证类型。我只是不知道如何定义返回的函数应该具有与生产者相同的参数。我知道 TS 中有所有这些实用程序类型,但我不知道在这种情况下如何使用它们。
最佳答案
您可以使用Parameters提取生产者函数参数类型的实用程序:
function cache<T, TProducer extends Producer<T>>(producer: TProducer): TProducer {
let cached: Promise<T>;
const wrapper = (...args: Parameters<TProducer>): Promise<T> => {
if (!cached) {
cached = producer(...args);
}
return cached;
};
return wrapper as TProducer;
}
关于typescript - 带有函数参数作为参数传递的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60665887/