簡體   English   中英

Typescript function 作為參數 - 使用輸入的 ZDBC11CAA5BDA28F77E6FB4EDABD8 推斷 output 類型

[英]Typescript function as argument - infer output type using inputted arguments

我有一個鈎子,它接受 function 作為參數,並返回另一個 function。 output function 具有與輸入的 ZC1C425268E68385D1AB5074C17A 相同的 arguments。 只有返回類型不同。

type InputFn = (...args: any[]) => Promise<string>
type OutputFn<TInput> = (args: Parameters<TInput>) => void

useDemo<TInput extends InputFn>(input: TInput): OutputFn {
   const output = useCallback((...args) => {
     input(args).then(str => doSomeStuff())
   }, 
   [])

   return output
}

我希望根據輸入鍵入 output。 例如

  const output = useDemo((a: string, b: number) => Promise.resolve(''))
  // Output Type: (a: string, b: number) => void

我怎樣才能做到這一點? 我目前只得到任何 [] 類型和很多錯誤。

您使用Parameters實用程序 type是正確的,但您希望在引用泛型類型參數TInput的返回類型聲明中使用它,而不是在它之外作為類型聲明:

function useDemo<TInput extends InputFn>(input: TInput): (...params: Parameters<TInput>) => void {
    return function(...args: Parameters<TInput>): void {
        input().then(str => { /*...*/ }); // Really need a `catch` on this! :-)
    };
}

然后例如:

const output1 = useDemo((x: string, y: number) => Promise.resolve(""));
//    ^−−− type is `(x: string, y: number) => void`
const output2 = useDemo((x: string) => Promise.resolve(""));
//    ^−−− type is `(x: string) => void`

游樂場鏈接

或者,如果您想單獨聲明它,您可以這樣做,但它必須是泛型類型,以便您可以將泛型參數的解析類型傳遞給useDemo

type InputFn = (...args: any[]) => Promise<string>;
type OutputFn<TInput extends InputFn> = (...params: Parameters<TInput>) => void;

function useDemo<TInput extends InputFn>(input: TInput): OutputFn<TInput> {
    return function(...args: Parameters<TInput>): void {
        input().then(str => { /*...*/ }); // Really need a `catch` on this! :-)
    };
}

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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