Typescript高级: 深入理解infer关键字

深入理解TypeScript条件类型:从基础到高级应用 TypeScript作为JavaScript的超集,其强大的类型系统为大型应用开发提供了坚实的保障。在TypeScript的高级类型特性中,**条件类型(Conditional Types)**无疑是最强大且实用的特性之一。本文将全面剖析条件类型的概念、语法、工作机制及其在实际开发中的应用场景,帮助开发者掌握这一重要特性。 阅读详情
AI摘要

本文深入解析了TypeScript中的infer关键字,展示了如何在泛型编程中利用infer增强类型推断能力,并通过实例介绍了infer在条件类型及映射类型中的应用。

概述

  • 在 TS 中,infer 是一个高级类型操作,特别是条件类型和映射类型中非常有用的关键字
  • 它在泛型中使用也会是一个强大工具,增强了类型推断的能力,让开发者更灵活地处理和操作类型
  • 它允许在泛型类型推导过程中捕获一个具体的类型,这对于编写复杂的类型转换和映射操作特别有用
  • infer 的定义
    • infer 表示在 extends 条件语句中以占位符出现的用来修饰数据类型的关键字
    • 被修饰的数据类型等到使用时才能被推断出来
  • infer 占位符式的关键字出现的位置
    • infer 出现在 extends 条件语句后的函数类型的参数类型位置上
    • infer 出现在 extends 条件语句后的函数类型的返回值类型上
    • infer 出现在类型的泛型具体化类型上

实现

1 )infer 出现在 extends 条件语句后的函数类型的参数类型位置上

// 定义了一个接口Customer,它描述了一个具有name(字符串类型)和moneyPaid(数字类型)属性的对象
interface Customer {
  name: string
  moneyPaid: number
}

// 定义了一个函数类型,接受一个Customer类型的参数并返回一个字符串
type custFuncType = (cust: Customer) => string

// 定义了一个泛型类型inferType<T>,这是理解的重点。这是一个条件类型,它使用了infer关键字
type inferType<T> = T extends (params: infer P) => any ? P : T

// 定义了inferResultType类型别名,它是通过将前面定义的custFuncType类型作为参数传递给inferType得到的
type inferResultType = inferType<custFuncType>
  • 分析一下这行代码:type inferType<T> = T extends (params: infer P) => any ? P : T
    • T extends (params: infer P) => any
      • 这部分是一个类型测试,检查T是否可以赋值给一个函数类型
      • 该函数接受一个参数(我们称之为params)
      • infer P关键字在这里用于声明一个新的类型变量P,用来捕获T中函数参数的实际类型
    • ? P
      • 如果上面的测试为真(即T确实是一个函数类型)
      • 那么整个条件类型的结果就是捕获的参数类型P
    • : T
      • 如果上面的测试为假(即T不是函数类型或不匹配)
      • 则条件类型的结果就是T本身,不做任何改变
  • 最后一行代码 type inferResultType = inferType<custFuncType>
    • custFuncType是一个接受Customer类型参数的函数,所以infer P会捕获到这个参数类型
    • 因此,inferResultType 实际上就是Customer类型

2 ) infer 出现在 extends 条件语句后的函数类型的返回值类型上

// 定义了一个接口Customer,它描述了一个具有name(字符串类型)和moneyPaid(数字类型)属性的对象
interface Customer {
    custname: string
    moneyPaid: number
}
// 这个类型定义了一个函数,该函数接受一个Customer类型的参数并返回一个字符串
type custFuncType = (cust: Customer) => string
type inferType<T> = T extends (params: any) => infer P ? P : T
type inferResultType = inferType<custFuncType>
  • 核心在这里, type inferType<T> = T extends (params: any) => infer P ? P : T
    • 上面,inferType 的 infer 在返回值的位置上
    • infer P 表示“推断出一个类型 P”,这个 P 是函数的返回类型
    • 它根据 extends 的检查结果来选择不同的类型
    • 如果 T 是一个符合 (params: any) => … 形式的函数类型
    • 那么表达式的结果是 P(即函数的返回类型)
    • 否则,表达式的结果是 T 本身
  • 最后,type inferResultType = inferType<custFuncType>
    • 由于,custFuncType 是一个返回值为 string 的函数类型
    • 符合,inferType 内部的三元推导的条件,因为 返回值是 P, 而在这里P又是 string 类型
    • 所以,type inferResultType 就是 string 类型

3 ) infer 出现在类型的泛型具体化类型上

class Subject {
    constructor(public id: number, public name: string) {}
}

const chineseSubject = new Subject(100, "语文");
const mathSubject = new Subject(101, "数学");

type ElementOfSet<T> = T extends Set<infer E> ? E : never;

const subjectsSet = new Set<Subject>([chineseSubject, mathSubject]);

type SubjectType = ElementOfSet<typeof subjectsSet>;

// 使用推断出的SubjectType类型
function printSubject(subject: SubjectType) {
    console.log(`学科ID: ${subject.id}, 学科名称: ${subject.name}`);
}

printSubject(chineseSubject);
  • 核心代码在这里:type ElementOfSet<T> = T extends Set<infer E> ? E : never;
    • 如果 参数 T 属于 Set 类型,则 ElementOfSet 则是 E 的类型
    • 这里 Set<infer E> 使用 infer E 推导出 E的类型,如果符合 extends 条件,则返回E,否则返回 never
  • const subjectsSet = new Set<Subject>([chineseSubject, mathSubject]);
    • 这里 subjectsSet 是一个 Set 类型,而且单个元素是 Subject 类型
  • type SubjectType = ElementOfSet<typeof subjectsSet>;
    • ElementOfSet<typeof subjectsSet> 这里符合内部条件,所以,它最终是一个 Subject 类型
  • 所以,在最后,printSubject 中完美运行

总结

  • infer关键字在TypeScript中为泛型编程提供了一个强大的工具
  • 它不仅增强了类型系统的表达能力,还使开发者能够编写出更加灵活和精确的类型定义
  • 通过掌握infer的使用,你能够在处理复杂类型逻辑和类型转换时更加游刃有余
  • 提升代码的类型安全性和可维护性
infer,TS 类型系统的手术刀 摘要:TypeScript中的infer关键字是一种高级类型推断工具,本质是类型系统的"临时变量"。它必须配合extends条件类型使用,通过模式匹配提取复杂类型的组成部分。主要应用场景包括:1)从Promise、数组等容器类型中解包内部类型;2)提取函数参数、返回值等元信息;3)处理字符串模板类型。infer特别适用于处理第三方库类型、减少重复定义和构建通用工具类型,但会提升代码复杂度,建议仅在底层工具类型中使用,业务代码保持显式声明。理解infer的关键在于将extends视为模式匹 阅读详情

相关推荐

掌握TypeScript infer:从类型推导到高级泛型实战

本文深入解析TypeScript中的infer关键字,从基础类型推导到高级泛型实战应用。通过Promise解包、对象属性提取等示例,展示infer在类型系统中的作用,并探讨协变、逆变等高级概念。最后提供构建类型工具库的实用技巧,帮助开发者提升TS泛型编程能力。

weixin_33691817的博客 313

TypeScript——理解 infer 关键字!

前言 TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。它是 JavaScript 的超集,不仅支持原生JS的写法,还增加了很多有用、强大的功能。众所周知, JavaScript 是弱类型语言,一些很低级却难以发现的 Bug 只有在运行时才能发现,而 TypeScript 却能够在编写代码的过程中就能避免绝大部分的低级报错。本专栏用于记录和分享我在使用 TypeScript 中的感悟和心得,以下来介绍一下 infer 的用法: infer

dizuncainiao的博客 2733

Open UI5 源代码解析之1248:requireAsync.js

requireAsync.js 模块解析 核心功能 该模块提供了一个简单的异步加载封装,将 SAP UI5 的 sap.ui.require 方法包装为 Promise 形式,方便在现代异步代码中使用。 实现特点 双重加载检测:首先同步检查模块是否已加载,若已存在则直接返回结果 Promise 封装:对于未加载的模块,将其包装在 Promise 中异步加载 轻量级设计:仅做最基本的加载功能封装,不包含缓存、重试等额外逻辑 使用场景 主要用于 UI5 灵活性层(fl)和运行时适配层(rta)的协作,特别是在需

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1405

【TS】1321- 学会 TS infer,写起泛型真香!

阿宝哥精心准备的《轻松学 TypeScript》视频教程已经更新到第十一期了,通过形象生动的动画,让你轻松搞懂 TypeScript 的难点和核心知识点!你知道如何获取 T0 数组类型中元素的类型和 T1 函数类型中的返回值类型么?给你 3 秒钟的时间思考一下。typeT0=string[]; typeT1=()=>string;要实现上述的功能,...

pingan8787 4261

新入手的Atmel-ICE产品说明

【一句话自我介绍】 我是Atmel最新推出的功能强大的调试编程工具,适用于Atmel ARM® Cortex®-M的Atmel SAM和AVR® 系列芯片。 【我支持的软件】 完美支持Atmel Studio 6.2以上版本直接支持ICC8AVR以上版本支持烧录ICCAVR、CVAVR、IAR等生成的HEX文件 【我支持的器件】 支持AVR 32-bit MCUs的JTA

kaloha3的专栏 1万+

openvpn 安装 (Alibaba Cloud Linux release 3 (Soaring Falcon))

1.错误:configure: error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config (/usr/bin/pkg-config) installed?# ta.key在/etc/openvpn/server/目录下可以如下配置,否则需要写完整路径。# 配置账号密码登录客户端需要ca证书(可选)# 证书校验算法 配置上面生成的完整路径。# ca证书 配置上面生成的完整路径。

dubhe_zhao的博客 2152

【ts】typescript高阶:条件类型与infer

学习目标 1、学习ts中的条件类型extends 2、infer用于存储类型推断出的类型 3、UnpackedArray、UnpackedFn、Unpacked、PropertyType、UnionToIntersection工具类型的实现1、条件类型的语法 2、infer的使用 二、工具类型的实现 1.UnpackedArray 功能:获取数组类型的值类型代码如下(示例): 2.UnpackedFn 功能:获取函数返回值类型代码如下(示例): 3.PropertyType 功能:获取对象类型的key类型代

qq_48896417的博客 2809

全球第一开源云ERP Odoo操作手册 模块安装和界面汉化指南

Odoo 的功能包含在不同的模块中, 刚创建的数据库除 Odoo 的核心模块外, 其它模块并没有被安装到系统中,你可以根据需要安装它们。本节将介绍安装模块和界面汉化的相关知识。

weixin_44793763的博客 2076

TypeScript 条件类型中的 infer 关键字:类型推断原理与实战指南(The Concise TypeScript Book)

`infer` 是 TypeScript 条件类型中最具威力的关键字之一,它允许类型系统在条件判断时"捕获"结构中的某个子类型并提取出来,从而让 `ReturnType`、`Parameters`、`Awaited` 这类工具类型的实现成为可能。本篇以开源书籍 [The Concise TypeScript Book](https://link.gitcode.com/i/3b2736e5b975

gitblog_01067的博客 381

Silly Tavern(酒馆)AI 角色扮演下载与安装教程(Windows本地部署)

SillyTavern是一款开源AI角色扮演前端工具,支持沉浸式对话和长期角色互动。本文详细介绍了在Windows系统F盘部署SillyTavern的完整流程,包括下载项目、安装Node.js和Git环境、配置路径、启动服务等关键步骤,并特别说明非系统盘路径可能遇到的npm安装问题及解决方法。成功启动后,用户可通过浏览器访问本地地址使用该工具进行AI角色扮演互动。

Tan3851的博客 1万+

高通IPA硬件加速介绍

‌ 高通IPA (Internet Protocol Accelerator)模块是一种硬件加速模块,由高通公司(Qualcomm)提供,主要用于优化移动设备上的网络数据传输,特别是通过 LTE 、 5G 等移动网络的数据传输‌‌。IPA模块通过硬件加速,显著提高了数据传输的速度和效率,同时降低了设备的功耗,并提供了更稳定的网络连接,减少了数据传输中的丢包和延迟‌。

四儿家的小祖宗的博客 1626

革命性TypeScript学习平台type-challenges:掌握高级类型系统

还在为TypeScript的高级类型特性感到困惑吗?想要真正掌握类型系统的强大能力却苦于缺乏系统性的练习?type-challenges项目正是你需要的革命性学习平台! 通过本文,你将获得: - ???? 深入理解TypeScript类型系统的核心机制 - ???? 掌握条件类型、映射类型、infer推断等高级技巧 - ???? 构建自己的类型工具库实战能力 - ???? 系统化的挑战难度分级和学习路径 - ?...

gitblog_01006的博客 738

2025_NIPS_Better Tokens for Better 3D: Advancing Vision-Language Modeling in 3D Medical Imaging

近年来,3D医学成像领域的视觉语言建模取得了显著进展,这得益于大规模带配对自由文本报告的计算机断层扫描(CT)语料库、更强大的架构以及高性能预训练模型。这些进展推动了自动报告生成和文本条件3D图像合成等应用的发展。然而,现有方法在处理高分辨率、长序列体积数据时仍面临挑战:对比预训练往往导致视觉编码器与临床语言错位,而基于切片的令牌化会模糊精细解剖结构,降低下游任务的诊断性能。

c_cpp_csharp的专栏 90

typescript学习:关键字,操作符,keyof,in,infer...

本文内容如下 关键字,操作符 如果你都有了答案,可以忽略本文章,或去TS学习地图寻找更多答案 关键字操作符 typeof JS中的typeof:在运行时判断类型 TS中的typeof:在编译时获取类型 interface Person { name: string, age: number, } 两者一样 type p1 = typeof person type p2 = Person in:遍历 type Names = "xiaoming" | "zhangsan" t

weixin_44828005的博客 4553

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

零基础入门simulink仿真--通信领域的调制解调技术:基于Simulink的PM信号调制与解调仿真建模示例

PM的基本原理是将基带信号(如语音或音乐信号)加载到高频载波信号的相位上。通过改变载波的瞬时相位,可以实现信息的传输。PM的优点包括抗噪声能力强、频谱利用率较高等,但其解调过程相对复杂。通过Simulink,我们可以通过模块化的建模方式实现PM信号的调制和解调过程,并观察信号在信道中的传输效果。通过本指南,我们介绍了如何基于Simulink搭建一个完整的PM信号调制与解调仿真模型,并进行仿真和性能评估。背景介绍:理解PM信号调制与解调的基本原理及其应用。所需工具和环境:列出进行PM仿真所需的工具和环境。

amy_mhd的博客 605

Typescript高级: 深入理解ConstructorParameters类型及借助infer构建带参数的工厂实例方法

在TypeScript中,利用泛型和类型推断,我们可以编写出既灵活又安全的代码特别是在处理类和其实例化过程中,这些特性显得尤为重要我们着重关注构造函数参数(constructor parameters)的类型处理以及如何利用泛型工厂函数来创建类的实例构造函数是面向对象编程中初始化对象状态的核心手段在TypeScript中,通过为构造函数及其参数添加类型注解可以确保在创建对象时遵循预定义的类型规则,从而提高程序的健壮性。

Wang的专栏 1425

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

条件类型用法全解析,彻底搞懂TypeScript中的 infer 与 extends 组合魔法

掌握TypeScript条件类型用法,轻松实现类型编程自动化。深入解析infer与extends组合在类型提取、函数返回值推导等场景的核心应用,提升代码安全与智能提示能力。原理清晰、示例丰富,值得收藏。

QuickProceed的博客 924

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TypeScript `infer` 关键字详解(从概念到实战)

infer是 TypeScript 在条件类型中的关键字。在类型推导过程中,声明一个待推断的类型变量。infer就是“让 TS 在这里自动推断类型,并把它存下来”。L : never;// 3// neverinfer必须出现在条件类型中。临时声明一个类型变量,捕获 TS 推断出来的类型。常见应用场景:提取函数参数/返回值、解包 Promise、数组元素类型。掌握infer后,你能看懂并写出更多高级工具类型,是进阶 TS 的必经之路。

nihao20190的博客 1118

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

The Concise TypeScript Book 实战:深入理解条件类型中的 `infer` 类型推断

`infer` 是 TypeScript 条件类型(Conditional Types)中最具威力的关键字之一:它允许你在类型层面“解构”一个类型,把藏在结构内部的成员类型提取出来复用。本文以 The Concise TypeScript Book 中《infer Type Inference in Conditional Types》一章为骨架,结合仓库中[条件类型](https://link.

gitblog_00718的博客 415

The Concise TypeScript Book:深入理解条件类型中的 `infer` 类型推断

`infer` 关键字是 TypeScript 条件类型中用于"就地声明待推断类型变量"的核心机制,它允许我们从 `T extends X ? Y : Z` 的结构中提取出被依赖的泛型参数类型,从而写出更灵活、可复用的类型定义。本文以《The Concise TypeScript Book》中「Вывод типа с помощью infer в условных типах」(条件类型中的

gitblog_00617的博客 221

TypeScript进阶知识之泛型相关(关键字【keypf、typeof、in、extend、infer】、泛型工具类型【Partial、Required、Readonly、Record……】)

TypeScript进阶知识之泛型相关(关键字【keypf、typeof、in、extend、infer】、泛型工具类型【Partial、Required、Readonly、Record、Exclude、Extract、Pick、Omit、NonNullable、ReturnType、Parameters】)

qq_48617322的博客 663

TypeScript 学习笔记(五)- infer

infer是在 typescript 2.8 中新增的关键字。 一、简单的示例 type ParamType<T> = T extends (...args: infer P) => any ? P : T; 在这个条件语句 T extends (...args: infer P) => any ? P : T中,infer P 表示待推断的函数参数。 整句表示为:如果 T 能赋值给 (...args: infer P) => any,则结果是 (...args: infer

kelly0721的博客 694

TypeScript泛型进阶:掌握高级类型编程,写出更具扩展性的代码

掌握TypeScript泛型进阶技巧,提升代码可复用性与类型安全。详解泛型约束、条件类型与映射类型在实际开发中的应用,帮助typescript入门者写出更灵活、易维护的代码。适合中高级开发者提升工程化能力,值得收藏。

CompiTide的博客 430

The Concise TypeScript Book 精讲:深入理解分布条件类型(Distributive Conditional Types)

分布条件类型是 TypeScript 类型系统中最强大也最容易被误解的机制之一:当一个条件类型作用于联合类型时,TypeScript 会把该联合类型"拆开",对每个成员分别求值,最后再把结果合并回一个联合类型。本文以开源仓库 typ/typescript-book(The Concise TypeScript Book)[俄语版文档 distributive-conditional-types.m

gitblog_00066的博客 349

The Concise TypeScript Book 精讲:条件类型(Conditional Types)从入门到实战

条件类型(Conditional Types)是 TypeScript 类型系统的核心机制之一,它允许你在类型层面表达"如果 A 成立则得到 B,否则得到 C"的分支逻辑。本指南以开源书籍 The Concise TypeScript Book 的第 40 章「Tipe Kondisional」(条件类型)为主体,完整继承其核心定义与示例,并结合该仓库中相邻章节(分布式条件类型、`infer` 推

gitblog_00593的博客 1009
上一篇: Go微服务: 基于Docker搭建Kong网关环境
下一篇: Typescript高级: 深入理解ConstructorParameters类型及借助infer构建带参数的工厂实例方法
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值