当前位置: 首页 > news >正文

typescript中infer常见用法

在 TypeScript 中,infer 是一个用于类型推断的关键字,通常与条件类型(Conditional Types)结合使用,用于从已有类型中提取或推断出某个子类型。它的核心作用是:在类型匹配过程中,“捕获” 符合特定结构的类型片段,并将其作为变量供后续使用。

infer 的核心特点

  1. 只能在条件类型的 extends 子句中使用(即 T extends ... infer U ...
  2. 用于 “捕获” 类型中的一部分,类似变量声明(infer U 可以理解为 “声明一个类型变量 U,并自动推断它的值”)
  3. 推断出的类型可以在条件类型的 “真分支”(true 部分)中使用

基础用法示例

1. 提取函数的返回值类型

最常见的场景是从函数类型中提取返回值类型:

// 定义一个条件类型,用于提取函数的返回值类型
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : T;// 使用示例
function getUser() {return { id: 1, name: '张三' };
}function sum(a: number, b: number) {return a + b;
}// 提取返回值类型
type UserResult = ReturnType<typeof getUser>; // { id: number; name: string }
type SumResult = ReturnType<typeof sum>;     // number
  • 原理:当 T 匹配 “函数类型” 时,infer R 会捕获该函数的返回值类型并赋值给 R
  • 实际开发中,TypeScript 已内置 ReturnType,无需手动定义
2. 提取数组的元素类型

从数组类型中提取元素的类型:

// 提取数组元素类型
type ArrayItem<T> = T extends (infer U)[] ? U : T;// 使用示例
type NumberItem = ArrayItem<number[]>;      // number
type StringItem = ArrayItem<string[]>;      // string
type UserItem = ArrayItem<{ id: number }[]>; // { id: number }
type NotArray = ArrayItem<string>;          // string(不匹配数组类型,返回原类型)

进阶用法示例

1. 提取 Promise 的 resolve 类型

从 Promise 类型中提取异步操作的结果类型:

// 提取Promise的resolve类型
type PromiseResult<T> = T extends Promise<infer R> ? R : T;// 使用示例
type ApiResult = PromiseResult<Promise<{ code: 200; data: string }>>;
// 结果:{ code: 200; data: string }type SyncResult = PromiseResult<number>;
// 结果:number(非Promise类型,返回原类型)
2. 提取函数的参数类型

从函数类型中提取参数的类型(可用于事件回调、钩子函数等场景):

// 提取函数的第一个参数类型
type FirstParam<T> = T extends (first: infer P, ...rest: any[]) => any ? P : never;// 提取函数的所有参数类型(返回元组)
type Params<T> = T extends (...args: infer P) => any ? P : never;// 使用示例
type ClickHandler = (e: MouseEvent, id: number) => void;type First = FirstParam<ClickHandler>; // MouseEvent
type AllParams = Params<ClickHandler>; // [MouseEvent, number]
3. 嵌套类型推断

处理多层嵌套的复杂类型:

// 提取嵌套数组的最内层元素类型
type DeepArrayItem<T> = T extends (infer U)[] ? DeepArrayItem<U> : T;// 使用示例
type Deep1 = DeepArrayItem<number[][]>;    // number
type Deep2 = DeepArrayItem<string[][][]>;  // string
type NotDeep = DeepArrayItem<number[]>;    // number

注意事项

  1. infer 只能在条件类型的 extends 子句中使用,不能在其他地方单独使用
  2. 同一条件类型中可以多次使用 infer,推断多个不同的类型片段
  3. 推断结果可能是联合类型(当匹配多种可能的类型结构时)
// 多次推断示例
type FuncParts<T> = T extends ((arg: infer A) => infer R) ? { arg: A; return: R } : never;type Part = FuncParts<(name: string) => number>;
// { arg: string; return: number }

http://www.dtcms.com/a/478518.html

相关文章:

  • 科技赋能塞上农业:宁夏从黄土地到绿硅谷的蝶变
  • 第13讲:深入理解指针(3)——数组与指针的“深度绑定”
  • 基于MATLAB的匈牙利算法实现任务分配
  • Type-C 接口充电兼容设计(针对 5V1A 需求)
  • Anaconda 学习手册记录
  • Python-适用于硬件测试的小工具
  • 第三方软件测评机构:【Locust的性能测试和负载测试】
  • 【Python】列表 元组 字典 文件
  • 简单asp网站深圳做个商城网站设计
  • OpenTelemetry 入门
  • 昆山做网站找哪家好wordpress 算数验证码
  • 网站建设服务费入阿里云域名注册平台
  • 美颜的灵魂:磨皮技术的演进与实现原理详解
  • 自定义半精度浮点数modelsim仿真显示
  • 广东GEO优化哪家专业哪家服务好
  • 【C#】await Task.Delay(100)与Thread.Sleep(100)?
  • 从智能补全到云原生适配:免费IDE DataGrip的技术实践与行业趋势
  • 多摄像头网络压力测试
  • 信息发布网站设计巴中网站建设有限公司
  • 图像处理-opencv(一)
  • 空包网站分站怎么做重庆市工程建筑造价信息网
  • 基于MATLAB的Excel文件批量读取与循环处理
  • 网站建设方案拓扑图平面设计现在怎么样
  • 高并发下的优雅延迟:Python异步爬虫(aiohttp)的速率限制实践
  • Python爬虫实战:获取同花顺股票资金流向数据并做分析
  • MyBatis的SpringBootVFS解析
  • 上海网站建设好处自建网站教程
  • 网站建设的作用是什么网站建设沟通准备
  • 【中间件Linux在环境安装】SpringBoot应用环境安装(一)-JDK安装
  • 【Linux环境下安装】SpringBoot应用环境安装(二)-Redis安装