条件类型和映射类型是 typescript 编译期静态推导类型的核心机制:条件类型用 t extends u ? x : y 实现类型层面判断,支持 infer 推断;映射类型通过 [k in keyof t] 批量变换属性,可结合 as 重命名键或与条件类型嵌套实现复杂类型操作。

条件类型和映射类型是 TypeScript 中用于“按需生成类型”的核心高级机制,它们不运行在 JavaScript 运行时,而是在编译期静态推导类型结构,让类型系统具备逻辑判断与批量转换能力。
条件类型:用 extends 做类型层面的“if 判断”
语法形式为 T extends U ? X : Y,意思是“如果类型 T 能赋值给类型 U,则结果是 X,否则是 Y”。它不是运行时分支,而是编译器根据类型关系自动选择返回类型。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 判断基础类型:
type IsString<t> = T extends string ? true : false;</t>
传入string得true,传入number得false - 提取数组元素类型(常用):
type ElementType<t t extends array u :><br><code>ElementType<string></string>→string;ElementType<boolean></boolean>→boolean - 配合
infer推断嵌套结构:type ReturnType<t t extends any> infer R ? R : never;</t>
可精准提取任意函数的返回类型
映射类型:批量操作对象属性的“类型工厂”
通过 [K in keyof T] 遍历类型 T 的所有键名,对每个属性做统一或条件化处理,生成新类型。本质是“结构复制 + 属性变换”。
- 基础写法:
type Partial<t in keyof t><br>把所有属性变成可选 —— 这就是内置 <code>Partial的实现原理 - 加只读修饰:
type Readonly<t readonly in keyof t></t> - 筛选特定类型字段(结合条件类型):
type StringKeys<t in keyof t as extends string k : never><br>输入 <code>{ name: string; age: number; email: string },输出只保留name和email
两者结合:解决真实开发中的类型复用难题
单独用条件类型能做分支判断,单独用映射类型能批量改结构,但组合起来才能应对复杂场景,比如“只提取对象里的函数属性”:
- 先用条件类型识别函数:
type IsFunction<t t extends function true : false></t> - 再用映射类型过滤并保留:
type FunctionProperties<t in keyof t as isfunction extends true k : never></t> - 结果类型只含原对象中值为函数的键,其他全被剔除,且类型完全保留
注意几个关键细节
-
keyof返回的是字符串字面量联合类型(如"id" | "name"),不是string,这是映射能精准控制每个键的前提 - 条件类型在遇到联合类型时默认“分布式”,即
string | number extends string ? A : B会被拆成string extends string ? A : B和number extends string ? A : B分别计算再合并结果 - 映射中使用
as可重命名键(TS 4.1+),例如[K in keyof T as `on${Capitalize<string k>}`]: T[K]</string>可批量加前缀
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










