[英]Generic function with parameters of function passed as a parameter
我正在嘗試實現一個小的緩存功能。 雖然我的實現似乎有效,但我很難在其中定義正確的類型。
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;
};
}
是的,我仍然需要改進它,以便根據傳遞的參數緩存該值,但這是一個較小且易於修復的問題。
在這種情況下, 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.