更改作为泛型参数

时间:2018-06-06 12:10:55

标签: typescript

您可以使用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>函数的方法,或者它是一个打字稿只是不支持的东西。

0 个答案:

没有答案