首页 > 解决方案 > 用 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>

标签: typescript

解决方案


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

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

推荐阅读