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

win2008网站404成都职业培训网络学院

win2008网站404,成都职业培训网络学院,wordpress cms原创,dede如何做网站目标读者:有一定 TypeScript 基础(了解泛型、条件类型)的同学,希望理解 infer 在类型体操中的作用。目录什么是 infer基础用法:在条件类型中推断类型常见场景与示例 提取函数返回值类型提取参数类型提取 Promise 内的类…

目标读者:有一定 TypeScript 基础(了解泛型、条件类型)的同学,希望理解 infer 在类型体操中的作用。


目录

  1. 什么是 infer

  2. 基础用法:在条件类型中推断类型

  3. 常见场景与示例

    • 提取函数返回值类型
    • 提取参数类型
    • 提取 Promise 内的类型
    • 提取数组元素类型
  4. 内置工具类型中的应用(ReturnType、Parameters 等)

  5. 实战:封装工具类型

    • UnpackPromise<T>
    • First<T>Last<T>
    • ElementType<T>
  6. 进阶技巧:多层 infer、递归推断

  7. 总结与学习建议


1. 什么是 infer

  • infer 是 TypeScript 在 条件类型 中的关键字。
  • 它的作用是:在类型推导过程中,声明一个待推断的类型变量

简单来说:infer 就是“让 TS 在这里自动推断类型,并把它存下来”。


2. 基础用法

最简单的形式:

type Foo<T> = T extends Array<infer U> ? U : T;

解释:

  • 如果 T 是数组(Array<...>),就提取里面的元素类型 U
  • 否则返回 T 本身。

示例:

type A = Foo<string[]>; // string
type B = Foo<number>;   // number

3. 常见场景与示例

3.1 提取函数返回值类型

type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;function add(a: number, b: number) {return a + b;
}type R = MyReturnType<typeof add>; // number

3.2 提取参数类型

type MyParameters<T> = T extends (...args: infer P) => any ? P : never;function greet(name: string, age: number) {}type Params = MyParameters<typeof greet>; // [string, number]

3.3 提取 Promise 内的类型

type UnpackPromise<T> = T extends Promise<infer U> ? U : T;async function fetchUser() {return { id: 1, name: 'Alice' };
}type User = UnpackPromise<ReturnType<typeof fetchUser>>;
// { id: number; name: string }

3.4 提取数组元素类型

type ElementType<T> = T extends (infer U)[] ? U : never;type E1 = ElementType<string[]>; // string
type E2 = ElementType<number[]>; // number

4. 内置工具类型中的应用

其实 TS 内置很多工具类型都是用 infer 实现的:

type ReturnType<T extends (...args: any) => any> =T extends (...args: any) => infer R ? R : any;type Parameters<T extends (...args: any) => any> =T extends (...args: infer P) => any ? P : never;

举例:

function hello(a: string, b: number) { return true; }type R = ReturnType<typeof hello>;   // boolean
type P = Parameters<typeof hello>;   // [string, number]

5. 实战:封装工具类型

5.1 UnpackPromise<T>

提取 Promise 内的类型:

type UnpackPromise<T> = T extends Promise<infer U> ? U : T;const p: Promise<string> = Promise.resolve('hi');
type R = UnpackPromise<typeof p>; // string

5.2 First<T>(数组第一个元素)

type First<T extends any[]> = T extends [infer F, ...any[]] ? F : never;type F1 = First<[1, 2, 3]>; // 1
type F2 = First<[]>;       // never

5.3 Last<T>(数组最后一个元素)

type Last<T extends any[]> = T extends [...any[], infer L] ? L : never;type L1 = Last<[1, 2, 3]>; // 3
type L2 = Last<[]>;        // never

5.4 ElementType<T>(提取数组元素)

type ElementType<T> = T extends (infer U)[] ? U : never;type E = ElementType<[string, number]>; // string | number

6. 进阶技巧:多层 infer、递归推断

6.1 多层 infer

可以在嵌套条件类型中多次使用 infer

type DeepUnpack<T> =T extends Promise<infer U>? U extends Promise<infer K>? K: U: T;// Promise<Promise<number>> → number
type X = DeepUnpack<Promise<Promise<number>>>;

6.2 递归推断

甚至可以递归定义:

type DeepUnpackAll<T> =T extends Promise<infer U>? DeepUnpackAll<U>: T;// Promise<Promise<Promise<string>>> → string
type Y = DeepUnpackAll<Promise<Promise<Promise<string>>>>;

7. 总结与学习建议

  • infer 必须出现在 条件类型 中。
  • 它的主要作用是:临时声明一个类型变量,捕获 TS 推断出来的类型
  • 常见应用场景:提取函数参数/返回值、解包 Promise、数组元素类型。
  • 掌握 infer 后,你能看懂并写出更多高级工具类型,是进阶 TS 的必经之路。

下一步学习:

  • 条件类型与分布式条件类型(T extends U ? X : Y
  • 内置工具类型源码(看一看 OmitPickInstanceType
  • 玩转类型体操题库(练习 TupleToUnionUnionToIntersection 等)

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

相关文章:

  • 网站源码授权wordpress调用相关页面
  • Excel 宏安全设置与强制启用宏
  • 万柳网站建设html网站开发中的应用
  • 中国站长小程序源码能直接用吗
  • 《通信之道—从微积分到5G》阅读笔记
  • 郑州网站建设网页设计网站备案转入
  • 广州网站建设出售sae wordpress 主题
  • 为什么在大数据处理场景下,存储过程比编程语言更合适?
  • 电子商务网站建设与管理课件辽宁建设工程信息网备案
  • 【软件安装】在 Visual Studio 2022 中安装 RDLC 报表插件的详细教程
  • Cloud Studio 免环境搭建创建机器学习环境并运行 Pytorch 案例
  • 11、【Ubuntu】【VSCode】VSCode 断联问题分析:getent 命令(一)
  • 网站被降权会发生什么影响吗怀化汽车网站
  • 护照阅读器识别行驶证:汽车检测站的效率助力
  • 网站一般字体网上做设计网站
  • Cortex-M中的DWT(Data Watchpoint and Trace,数据观察点与跟踪单元)
  • 自助建网站系统看电影pexels免费素材网站
  • 做评选活动的网站网站建设费会计处理
  • 私人程序定制:综合能源混合博弈
  • 蓝色网站源码室内展厅设计公司
  • 西电信息化建设网站山东网站制作设计
  • Django 的动态特性:从 Python 动态机制到框架设计思想
  • 矽塔 SA8204 输入耐压36V 2.5A可调过流保护 集成故障报告的智能过压/过流保护芯片
  • 十堰微网站建设网络交友的网站建设
  • Spring—注解开发
  • Hugging Face 2025年10月21日 Top 10 热门AI模型
  • 事件网站推广杭州平面设计公司
  • 粮食网站建设的背景及意义大型网站制作怎么样
  • LangGraph 入门,层级介绍LangGraph
  • 360doc 网站怎么做江西专业网站建设