ts 中 ReturnType 作用

`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],获取了函数数组中每个函数的返回值类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yqcoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值