前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TS中的内置条件类型:ReturnType

TS中的内置条件类型:ReturnType

原创
作者头像
泯泷、
发布2023-08-27 22:55:53
7130
发布2023-08-27 22:55:53
举报
文章被收录于专栏:浏览器专题

先说一下条件类型是什么

  1. 条件类型是一种由条件表达式所决定的类型。
  2. 条件类型使类型具有了不唯一性,同样增加了语言的灵活性。

总言之,条件类型就是在类型中添加条件分支,以支持更加灵活的泛型,满足更多的使用场景。

例如:

代码语言:typescript
复制
T extends U ? X : Y

表示若类型T可被赋值给类型U,那么结果类型就是X类型,否则就是Y类型。

内置条件类型则是TS内部封装好的一些类型处理,使用起来更加便利。

内置条件类型:ReturnType\<Type>

在 2.8 版本中,TypeScript 内置了一些与 infer 有关的映射类型,就比如说我们今天的主角:ReturnType<Type>

其用于提取函数的返回值类型:

Constructs a type consisting of the return type of function Type.

手撕示例:

代码语言:typescript
复制
type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;

ReturnType<T> 只是将 infer P 从参数位置移动到返回值位置,因此此时 P 即是表示待推断的返回值类型。

代码语言:typescript
复制
// 比如
type Func = () => User;
type Test = ReturnType<Func>; // Test = User

// 其他例子
type T0 = ReturnType<() => string>; // string
type T1 = ReturnType<<T>() => T>; // unknown
type T2 = ReturnType<<T extends U, U extends number[]>() => T>; // number[]

非法的例子:

代码语言:typescript
复制
type T = ReturnType<string>;
// Type 'string' does not satisfy the constraint '(...args: any) => any'.
代码语言:typescript
复制
type T = ReturnType<Function>;
// Type 'Function' does not satisfy the constraint '(...args: any) => any'.
// Type 'Function' provides no match for the signature '(...args: any): any'.

以上均不满足(...args: any): any'.,type T 将被视为any处理。

其他内置的条件类型还有:

代码语言:typescript
复制
Exclude<T, U> -- 从T中剔除可以赋值给U的类型。
Extract<T, U> -- 提取T中可以赋值给U的类型。
NonNullable<T> -- 从T中剔除null和undefined。
InstanceType<T> -- 获取构造函数类型的实例类型。

讲回infer

infer 最早出现在此 PR 中,表示在 extends 条件语句中待推断的类型变量。

示例如下:

代码语言:txt
复制
type ParamType<T> = T extends (arg: infer P) => any ? P : T;

在这个条件语句 T extends (arg: infer P) => any ? P : T 中,infer P 表示待推断的函数参数。

整句表示为:如果 T 能赋值给 (arg: infer P) => any,则结果是 (arg: infer P) => any 类型中的参数 P,否则返回为 T

代码语言:typescript
复制
interface User {
  name: string;
  age: number;
}

type Func = (user: User) => void;

type Param = ParamType<Func>; // Param = User
type AA = ParamType<string>; // string

参考:深入浅出TSUtility Types TS文档大厂手撕

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先说一下条件类型是什么
  • 内置条件类型:ReturnType\<Type>
  • 讲回infer
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档