2 - 获取函数返回类型
不使用 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]