# 2-获取函数返回类型

# 题目描述

不使用 ReturnType 实现 TypeScript 的 ReturnType<T> 泛型。

例如:

const fn = (v: boolean) => {
  if (v) return 1;
  else return 2;
};

type a = MyReturnType<typeof fn>; // 应推导出 "1 | 2"

# 分析

这题放在 medium 着实有点难堪,因为其实现方式和实现 Parameters 一致,甚至还相对简单。

核心还是利用 推断匹配的套路,只是推断的位置不同。

# 题解

type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
// 下面的写法是错误的,因为限制了不能有参数,当函数有参数时,会走 false 逻辑,返回 never
// type MyReturnType<T> = T extends () => infer R ? R : never;

// number
type Test = MyReturnType<(a: number) => number>;

这里需要注意的,是参数的写法,因为并不限制有多少参数,也不限制参数的类型,所以可能会理所当然的认为不写参数就可以了,但是实际上不写参数就对应着没有参数,那么就会导致类型判断出错,走了 false 逻辑。

# 知识点

  1. 推断匹配可以用在函数的返回类型上
  2. 对函数的入参没有限制时,不能为空,可以写 ...args: any[] 或者 ...args: unknown[]
Last Updated: 2023/5/16 06:00:28