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