`ReturnType` 用于获取函数的返回值类型。
一、基本概念和语法
1. 定义和语法结构
`ReturnType`是一个泛型类型,其语法为`ReturnType<T>`,其中`T`是一个函数类型。例如,如果有一个函数`add`,`ReturnType<typeof add>`就可以获取`add`函数的返回值类型。
2. 简单示例
function getFullName(firstName: string, lastName: string): string {
return firstName + " " + lastName;
}
```
使用`ReturnType`来获取这个函数的返回值类型
```typescript
type FullNameReturnType = ReturnType<typeof getFullName>;
// FullNameReturnType的类型为string
二、在函数式编程和类型推导中的应用
1. 函数式编程中的作用
1.1 组合函数类型检查
例如:假设有两个函数`f`和`g`,`f`的返回值作为`g`的输入,通过`ReturnType`可以精确地定义它们之间的类型关系。
function f(x: number): string {
return x.toString();
}
function g(y: string): boolean {
return y.length > 0;
}
type IntermediateType = ReturnType<typeof f>;
// IntermediateType的类型为string,与g函数的输入类型一致,确保了类型安全的函数组合
1.2 高阶函数类型定义
例如:一个高阶函数`createAdder`,它返回一个将输入数字加上一个固定数字的函数:
function createAdder(n: number): (x: number) => number {
return function (x: number) {
return x + n;
};
}
type AdderFunctionReturnType = ReturnType<typeof createAdder>;
// AdderFunctionReturnType的类型为(x: number) => number,准确地定义了createAdder函数返回的函数类型
2. 类型推导和泛型约束
2.1 泛型函数类型推导
例如:有一个泛型函数`processData`,它接受一个函数作为参数,并对该函数的返回值进行处理
function processData<T, R extends ReturnType<T>>(func: T, data: R): R {
// 对func的返回值(类型为R)进行处理
return func(data);
}
function double(x: number): number {
return x * 2;
}
const result = processData(double, 5);
// result的类型为number,因为double函数的返回值类型为number,通过ReturnType推导了R的类型为number
2.2 复杂类型结构中的推导
例如:一个包含多个操作函数的对象
interface MathOperations {
add: (a: number, b: number) => number;
multiply: (a: number, b: number) => number;
}
type AddReturnType = ReturnType<MathOperations["add"]>;
// AddReturnType的类型为number,准确地获取了add函数的返回值类型
三、与其他类型操作符的结合使用
1. 结合条件类型
1.1 根据返回值类型进行条件判断
例如:我们可以创建一个类型,根据函数是否返回`null`来决定最终的类型:
type NonNullableReturnType<T extends (...args: any[]) => any> = T extends (
...args: any[]
) => null
? never
: ReturnType<T>;
function returnsNull(): null {
return null;
}
function returnsString(): string {
return "Hello";
}
type NonNullableReturn1 = NonNullableReturnType<typeof returnsNull>;
// NonNullableReturn1的类型为never,因为returnsNull函数返回null
type NonNullableReturn2 = NonNullableReturnType<typeof returnsString>;
// NonNullableReturn2的类型为string,因为returnsString函数返回string
2. 与映射类型一起使用
2.1 处理函数数组的返回值类型
例如:有一个函数数组
const functionsArray: [() => number, () => string] = [() => 5, () => "World"];
type FunctionArrayReturnTypes = {
[K in keyof typeof functionsArray]: ReturnType<(typeof functionsArray)[K]>;
};
// FunctionArrayReturnTypes的类型为[number, string],获取了函数数组中每个函数的返回值类型