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