簡體   English   中英

具有作為參數傳遞的函數參數的泛型函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM