TypeScript 08:条件类型、infer 与手写工具类型

【高频考点精讲】TypeScript高级类型:条件类型和infer关键字的妙用 🧑‍🏫:全栈老李📅:2025 年 6 月🧑‍💻:前端初学者、进阶开发者🚀:本文由全栈老李原创,转载请注明出处。今天咱们聊聊TypeScript里两个让人又爱又恨的高级特性——条件类型和infer关键字。我是全栈老李,一个喜欢把复杂技术讲明白的码农。这两个特性就像TypeScript里的"魔法棒",用好了能让你的类型系统变得异常强大。 阅读详情

TypeScript 08:条件类型、infer 与手写工具类型

选学进阶。建议先读第 03 课(泛型与 mapped type)——本课是它的续篇。

1. 条件类型:类型世界的三元表达式

type IsString<T> = T extends string ? '是字符串' : '不是字符串'

type A = IsString<string> // '是字符串'
type B = IsString<number> // '不是字符串'

和三元表达式 condition ? a : b 同构,条件是第 3 课的 extends(是否满足形状)。T 填进来的时候才求值——复印机回锅。

分发:T 是联合类型时,会「逐个成员过一遍,再把结果合并」:

type ToArray<T> = T extends unknown ? T[] : never

type R = ToArray<string | number> // string[] | number[](不是 (string | number)[]!)

内置的 Exclude / Extract / NonNullable 全是「分发 + 条件」造出来的。

2. infer:在匹配中「抓一个占位符」

extends 匹配形状时,infer X 表示「这个位置是什么都行,抓出来命名为 X」:

type ElementType<T> = T extends (infer E)[] ? E : never
type E1 = ElementType<string[]> // string:数组元素被抓出来

type Unpacked<T> = T extends Promise<infer V> ? V : T
type U1 = Unpacked<Promise<string>> // string:Promise 拆包

揭底:第 03 课用的 ReturnType,标准库原文就长这样——

type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never

3. 模板字面量类型:类型里也能写模板字符串

type Greeting = `hello ${'world' | 'TS'}` // 'hello world' | 'hello TS'

内置四件套 Uppercase / Lowercase / Capitalize / Uncapitalize 配合联合类型最好用:

type Getters = `get${Capitalize<'name' | 'age'>}` // 'getName' | 'getAge'

联合类型进模板会自动做笛卡尔积;${number} 可以约束「带单位的字符串」:

type Method = 'get' | 'post'
type Path = '/users' | '/orders'
type Route = `${Method} ${Path}` // 4 种组合全部合法

type CssSize = `${number}px` // '120px' ✅  '120' ❌

典型场景:事件名(onXxx)、路由、CSS 值这类「字符串但有规律」的约束。

4. 手写工具类型:收官

三种手法合体(分发+条件、mapped、keyof),常用工具类型全部可以手写:

// Exclude 的原理:分发 + 条件类型——不匹配的成员变 never,自然消失
type MyExclude<T, U> = T extends U ? never : T
type Remain = MyExclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'

// Pick:mapped 遍历,但只遍历 K 指定的键(对比 MyPartial 遍历全部)
type MyPick<T, K extends keyof T> = {
  [P in K]: T[P]
}

// Record:keyof any = string | number | symbol,即「所有合法键类型」
type MyRecord<K extends keyof any, V> = {
  [P in K]: V
}

到这里,Partial / Pick / Record / Exclude / ReturnType 你都亲手写过一遍了——工具类型没有魔法,遇到没见过的泛型按「约束 → 条件 → infer → mapped」拆开读即可。

5. 高频报错速查

报错人话
Type '"gender"' does not satisfy the constraint 'keyof User'Pick 的 K 用了不存在的键
Type '"a"' is not assignable to type 'Remain'Exclude 排除后的联合不含它
Type 'X' is not assignable to type 'never'条件类型两边没交集,或分发没按预期发生
【TypeScript】TS条件类型(十) 条件类型允许根据一个或多个条件对类型进行推断,并且还能在在类型级别上进行复杂的逻辑运算和类型操作。 阅读详情

相关推荐

从零实战:基于华中8型数控系统的CNC数据采集与二次开发

本文详细介绍了基于华中8型数控系统的CNC数据采集与二次开发实战指南。从开发环境准备到核心数据采集实现,涵盖Windows平台配置、实时数据采集、报警处理等关键技术,帮助开发者快速掌握华中数控系统的数据采集能力,提升智能制造水平。

weixin_42561143的博客 814

Typescript进阶:解锁Infer类型的使用

P:如果条件 T extends (...args: infer P) => any 为真,即 T 确实是一个函数,那么类型为 P,也就是函数的参数类型列表。简单来说,它就像是一种“类型占位符”,可以自动帮你在复杂的类型表达式中找到你想要的类型,然后把它提取出来。与这个类似的,TS还有一个内置的通用的工具方法,从函数类型中提取参数类型,并将它们作为一个元组类型。从类型中推断:infer 的作用是从符合条件的类型中“提取”出具体的类型,类似于函数的参数解构。是一个函数类型,这个函数可以接收任意数量的参数(

zmh_fuhuasishui的专栏 1327

实证研究之|stata清洗charls数据

stata

qq_45313933的博客 6763

TypeScript 条件类型中的 infer:从类型中提取类型的核心机制

`infer` 是 TypeScript 条件类型中用于"推断并提取"类型的核心关键字,它允许你从某个依赖类型参数的结构中反向抽取出嵌套的类型,从而写出高度灵活、可复用的类型工具。本文以 [The Concise TypeScript Book](https://link.gitcode.com/i/28b9d81f87be9073e846bfed09e40191) 的 [infer Type I

gitblog_00392的博客 1265

linux离线安装nginx

linux离线安装nginx

zhang_130914036的博客 9349

WRF后处理:python cartopy绘制土地利用/土地分类图//python绘制WRF下垫面类型(以北极为例)

下垫面类型对于WRF的地表过程十分重要,而在我们研究WRF的地表过程之前,需要对输入的土地利用类型进行一些绘制,以便后续的修改。LU_MODIS21函数定义了绘制的土地类型、标签与对应色标,我们使用时,直接引用LU_MODIS21()即可返回。其实很简单,只要将你拥有的土地类型数据提取出来,将原本函数中的labels和C切片,重新定义色标再绘制即可。在这里,我将以北极地区为例,绘制北极地区的WRF下垫面数据,我使用的MODIS21这类。

weixin_43750300的博客 3860

【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

ARM学习 | 紧耦合存储器 (TCM)

TCM 是一种专用的片上存储器,直接与处理器核心耦合。确定性访问:由于不涉及缓存替换或一致性管理,访问延迟固定。高带宽:TCM 通常通过专用总线连接处理器核心,可以提供更高的数据吞吐率。用户管理:TCM 的分配和管理完全由开发者控制,不依赖硬件缓存策略。ARM 处理器中的 TCM 通常分为ITCM(指令紧耦合存储器)和DTCM(数据紧耦合存储器),分别用于存储指令和数据。TCM 是 ARM 处理器中不可忽视的重要特性,在实时系统和高性能嵌入式应用中具有重要地位。

qq_43167806的博客 3329

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

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

Wang的专栏 3209

FANUC机器人电弧跟踪功能深度解析:从电流采样原理到ROBOGUIDE仿真避坑指南

本文深度解析FANUC机器人电弧跟踪技术,从电流采样原理到ROBOGUIDE仿真避坑指南,详细介绍了电流波形分析、实时补偿机制及现场调试技巧。针对工业焊接中的常见问题,提供从底层原理到高阶应用的解决方案,帮助工程师优化自动化焊接质量。

weixin_31785177的博客 553

vcpkg管理OpenCASCADE的5个高效技巧:从多版本共存到离线部署

本文详细介绍了使用vcpkg高效管理OpenCASCADE的5个实用技巧,包括多版本共存、性能优化、团队共享、CI/CD集成和离线部署。通过自动配置和版本控制,vcpkg显著简化了OpenCASCADE的开发环境管理,特别适合工业级CAD开发场景。

rain6的博客 189

TypeScript——理解 infer 关键字!

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

dizuncainiao的博客 2733

【论文精读】《Towards Deep Learning Models Resistant to Adversarial Attacks》

本文探讨了深度学习模型在面对对抗性攻击时的脆弱性,并提出了一种基于鲁棒优化的方法来增强神经网络的对抗鲁棒性。通过鞍点优化框架,作者提供了对抗攻击和防御机制的统一视角,并在MNIST和CIFAR-10数据集上验证了其方法的有效性。对抗训练的核心思想是将对抗样本引入训练过程,使模型能够学习到对抗样本的特征,从而提升其鲁棒性。本文通过鞍点优化框架提出了一种基于鲁棒优化的对抗训练方法,显著提升了深度学习模型的对抗鲁棒性。本文为深度学习模型的对抗鲁棒性研究提供了新的理论和实证支持,同时为未来研究指明了方向。

nmdbbzcl的博客 611

【typescript】infer的理解与使用

前言 以前一直不会用infer,要么直接就是returnType,压根不需要用infer,网上那些教程只给示例不给具体场景就无法让人很好理解这玩意,并且很好

不忘初心,坚定道路! 5156

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

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

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

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

QuickProceed的博客 924

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TypeScript高级类型-条件类型

TypeScript高级类型-条件类型 预备知识: 泛型 高级类型 为什么需要条件类型? 在TypeScript使用过程中,我们一般会直接指定具体类型 比如: let str: string = 'test'; 然而,我们在编写代码的过程中,会遇到不能明确指定其具体类型的情况 比如: declare function f<T extends boolean>(x: T): T e...

💻 Code:TypeScript / Engineering 🤖 AI:Prompt Optimization / Context Memory / Coding Agents 4189

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TypeScript 条件类型(Conditional Types)完全指南:extends 三元语法、infer 推断、分发行为与内置工具类型

本篇技术指南围绕《The Concise TypeScript Book》(typescript-book 仓库)第 40~44 章的"条件类型"主线展开,系统讲解 `T extends U ? X : Y` 的核心语法、联合类型分发(distributive)机制、`infer` 类型推断、递归条件类型以及 `Exclude`、`Extract`、`ReturnType` 等内置工具类型的底层原

gitblog_07235的博客 509

条件类型和 infer 关键字

TypeScript 条件类型与 infer 摘要 TypeScript 的条件类型和 infer 关键字提供了强大的类型推断能力。条件类型通过 T extends U ? X : Y 语法实现类型级别的条件判断,允许根据输入类型动态决定输出类型。这种机制支持嵌套条件,并能自动对联合类型进行分发处理。 infer 关键字则用于从复杂类型中提取子类型,常见于数组元素、函数返回值等场景的推断。它支持多位置推断,并可与条件类型结合实现递归解构。两者协同工作可创建高度动态的类型系统,如自动提取 Promise 包装

zimin的专栏 910

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

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

gitblog_01067的博客 381

条件类型实战:TypeScript-New-Handbook 类型变换的核心武器

条件类型(Conditional Types)是 TypeScript 类型系统中实现"类型变换"的核心武器,它让你能在编译期根据类型之间的关系自动做出判断,从而写出更精准、更灵活的泛型代码。TypeScript-New-Handbook 是官方新版 TypeScript 手册的孵化仓库,其中《Types from Transformation》章节用大量实战例子系统讲解了条件类型、`infer`

gitblog_00334的博客 900

TypeScript从零开始(五):条件类型与映射类型

Hello,大家好,我是三棵杨树~欢迎阅读TypeScript 从零开始系列文章第五篇!在前几篇文章中,我们详细讲解了 TypeScript 的基础类型、泛型等核心概念。随着代码复杂度的提高,我们难免会遇到需要根据类型动态生成新类型的场景,而这正是条件类型和映射类型的用武之地。本篇文章将重点介绍条件类型与映射类型的概念和使用场景,帮助您更灵活地操作和转换类型。让我们开始我们的 TS 学习之旅吧!在本文中,我们详细介绍了 TypeScript 中的条件类型与映射类型。

三棵杨树的博客 1015

Flow 中条件类型与 infer 的 TypeScript 迁移实战:从 conditional_types_infer 评估用例看 TS→Flow 转换

本文基于 Flow 官方评估套件([evals/evals/04_ts_to_flow/conditional_types_infer](https://link.gitcode.com/i/5fdb9a2a39b28e5ac6f147cf7a57e4fc))中的 `conditional_types_infer` 用例,剖析 TypeScript 条件类型与 `infer` 推断如何被转换为地道

gitblog_00265的博客 411

TypeScript 条件类型中的 `infer` 类型推断:从《The Concise TypeScript Book》掌握类型提取的进阶用法

`infer` 是 TypeScript 条件类型中用于**从依赖泛型参数的类型中提取(推断)该泛型参数**的核心关键字,它让类型定义从"显式声明"走向"自动推导",是编写灵活、可复用类型工具(如 `ReturnType`、`Parameters`)的底层基石。本文将基于开源仓库 [typescript-book](https://link.gitcode.com/i/375e6519436461

gitblog_01044的博客 499

Claude Desktop 中文补丁快速指南:3 步完成桌面界面汉化,支持 3 种中文变体切换

claude-desktop-zh-cn 是 Claude Desktop 的本地中文补丁,给 macOS、Windows、Linux 版加入简体中文、繁体中文(zh-TW、zh-HK)三个选项并装好中文界面资源。下面按安装步骤、语言入口、合并原理的顺序讲一遍。 ## 为什么要装一个中文补丁 官方 Claude Desktop 只带英文界面,在线账号的聊天页面也是英文,长期使用每个设置项、每条

gitblog_00520的博客 704

ts泛型,映射,条件类型和类型提取infer和一些常用工具库的说明

ts泛型,映射,条件类型和类型提取infer和一些常用工具库的说明

动感超人的博客 3007

TypeScript中的infer关键字

在TypeScript中,infer是一个关键字,用于在条件类型(conditional types)中推断(infer)类型参数。通过使用infer关键字,我们可以在类型系统中进行类型的自动推断,从而实现更加灵活和可复用的类型定义。infer关键字通常用于条件类型(conditional types)中,条件类型是TypeScript中的高级类型操作符之一。通过条件类型,我们可以根据某个类型的特性,在类型系统中进行条件分支和类型的变换。

专注于技术,分享实战经验,探索技术边界,用代码构建更美的数字世界。 1282
上一篇: TypeScript 07:工程化——import type、声明文件与 tsconfig
下一篇: React01:JSX 与渲染心智模型
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值