Skip to main content

2 - 获取函数返回类型

Answer TestCases

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

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

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

Solution

我们需要定义类型 MyReturnType 用于获取函数的返回值类型

type MyReturnType<T extends Function> = T extends (...args: any) => infer R
? R
: never

MyReturnType 接收一个泛型 T, 该泛型 T 需继承自 Function 类型。

条件类型 T extends (...args: any) => infer R ? R : never 中,如果泛型 T 是一个函数则返回类型 R, 否则返回 never

由于传入的泛型 T 是一个函数类型,并不能获取这个函数的返回值类型,因此可以用 关键字 infer 来提取,infer R 相当于定义了类型变量 R, 其值是函数的返回值类型

下面的示例用于获取 User 全部属性中的类型

type User = {
name: string
age: number
}

type GetUserPropsType<T> = T extends { name: infer X; age: infer Y }
? [X, Y]
: never

type userPropsType = GetUserPropsType<User> // [string, number]