您可以使用ReturnType<T>
获取任何函数的返回类型,但似乎无法创建ChangeReturnType<T, U>
以便以下方法有效:
type F = (a: number, b: number) => string;
type NewF = ChangeReturnType<F, Promise<string>>;
// NewF is now: (a: number, b: number) => Promise<string>
我知道有办法改变返回类型,例如:
type ChangeReturnType<T, U> = (...args: any[]) => U;
但这会删除所有参数信息,因此非常无用。
据我所知,问题归结为获取参数列表的类型,这样我就可以直接做这样的事情:
type ParameterList<T> = /* insert black magic here */;
type ChangeReturnType<T, U> = (ParameterList<T> => U);
但我不认为这是可能的。我尝试使用infer
,但我无法使用它来确定&#39;类型&#39;参数列表。你可以使用像这样的一些廉价技巧:
type ParameterList<T> =
T extends (a: infer P1) => any ? [P1] :
T extends (a: infer P1, b: infer P2) => any ? [P1, P2] :
T extends (a: infer P1, b: infer P2, c: infer P3) => any ? [P1, P2, P3] : [any];
但这有问题:
我的问题是,如果你们中的任何人知道创建这样一个ChangeReturnType<T, U>
函数的方法,或者它是一个打字稿只是不支持的东西。