用Typescript中的映射函数替换函数的返回类型

时间:2018-07-21 06:56:23

标签: typescript

我想通过使用映射函数来替换函数的返回类型。 它应该看起来像这样:

// typescript 2.9, so no tuple arguments support yet.
type WithNewReturnType<
  F1 extends (...args: T[]) => V,
  F2 extends (arg: V) => MV,
  T,
  V,
  MV
> = ((...args: T[]) => MV);

// use case
const chain = <F1, F2>(f1: F1, f2: F2): WithNewReturnType<F1, F2> =>
  (...args) => f2(f1(...args));

F1的返回类型应与F2的参数类型匹配。

上面的代码有两个问题:

  1. 它抱怨F1和F2未使用。
  2. 它需要5个参数而不是2个参数,例如WithNewReturnType。

如何仅使用两个保持约束R<F1> === A<F2>的参数来做到这一点?

1 个答案:

答案 0 :(得分:1)

玩转之后,我自己想出了一个答案:

export type Chained<F1, F2> = F1 extends (
  ...args: Array<infer T>
) => infer V
  ? (F2 extends (arg: V) => infer MV ? ((...args: T[]) => MV) : never)
  : never;