条件类型和映射类型是 typescript 类型体操的两大支柱,支持编译期逻辑判断、结构转换与动态推导;条件类型语法为 t extends u ? x : y,用于类型兼容性判断;映射类型语法为 { [p in k]: t },用于批量改造属性结构;二者协同可实现组件 props 互斥约束等真实业务场景;递归与 infer 可处理变长结构如 query string 的精准推导。

条件类型和映射类型是 TypeScript 类型体操的两大支柱,它们配合使用能实现编译期的逻辑判断、结构转换与动态推导。关键不在于“能不能写”,而在于“是否贴合业务约束”——比如让一个组件的 props 在互斥配置下自动禁用非法组合,或让一个解析函数根据字符串字面量精准推导出对象键名。
条件类型:做类型层面的 if-else
语法是 T extends U ? X : Y,本质是类型兼容性判断。它不是运行时分支,而是在类型检查阶段“计算”出结果类型。
- 基础判断:区分函数与非函数类型
type IsFunction
type R1 = IsFunction void>; // true
type R2 = IsFunction
- 常用于提取/过滤:比如从联合类型中筛出函数成员
- 注意分布式行为:对
string | number使用条件类型,默认会分别对每个成员计算,再合并结果(string[] | number[])。如需整体处理,可用元组包裹绕过分布,例如[T] extends [U] ? X : Y
映射类型:批量生成或改造属性结构
语法是 { [P in K]: T },相当于对联合类型 K 的每个成员做一次映射。它天然支持修饰符(readonly、?)、键重命名(通过 as)和值类型变换。
- 基础用法:把接口所有属性设为可选
type PartialByKeys
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 进阶技巧:结合
as动态重命名键,比如统一加前缀 - 与条件类型嵌套:只对满足某条件的属性应用映射,其余保持原样
两者协同:实现真实业务中的类型防御
典型场景是组件 props 的互斥控制。例如按钮组件要求 href 和 onClick 不能同时存在:
- 先用条件类型定义合法组合:若传了
href,则onClick必须不可用;反之亦然 - 再用映射类型生成最终 props 类型,其中被排除的字段在智能提示中消失、强行传入则报错
- 实际效果:写
<button href="#" onclick="{()"> {}} /></button>会在编辑器里立刻标红
这种能力不是炫技,而是把文档里的“禁止同时设置”规则,变成编译器可执行的硬约束。
递归 + infer:处理不确定长度的结构
当面对 query string、路径参数、嵌套对象等变长结构时,需引入递归类型与 infer 提取片段。
-
infer在条件类型中声明待推导类型变量,常用于解包 Promise、提取函数参数、切分字符串字面量 - 递归让类型能“一层层剥开”字符串或元组,例如:
type ParseParam<s> = S extends `${infer K}=${infer V}` ? { [K]: V } : never;</s> - 配合映射类型,就能从
"a=1&b=2"字面量推导出{ a: "1"; b: "2" },且字段名有完整提示
这类推导完全发生在编译期,不产生任何运行时代码,却极大提升了 API 的可用性与健壮性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










