条件类型和映射类型是 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”。它不是运行时分支,而是编译器根据类型关系自动选择返回类型。
- 判断基础类型:
type IsString<T> = T extends string ? true : false;
传入string得true,传入number得false - 提取数组元素类型(常用):
type ElementType<T> = T extends Array<infer U> ? U : T;ElementType<string[]>→string;ElementType<boolean>→boolean - 配合
infer推断嵌套结构:type ReturnType<T> = T extends (...args: any) => infer R ? R : never;
可精准提取任意函数的返回类型
映射类型:批量操作对象属性的“类型工厂”
通过 [K in keyof T] 遍历类型 T 的所有键名,对每个属性做统一或条件化处理,生成新类型。本质是“结构复制 + 属性变换”。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 基础写法:
type Partial<T> = { [K in keyof T]?: T[K] };
把所有属性变成可选 —— 这就是内置Partial的实现原理 - 加只读修饰:
type Readonly<T> = { readonly [K in keyof T]: T[K] }; - 筛选特定类型字段(结合条件类型):
type StringKeys<T> = { [K in keyof T as T[K] extends string ? K : never]: T[K] };
输入{ name: string; age: number; email: string },输出只保留name和email
两者结合:解决真实开发中的类型复用难题
单独用条件类型能做分支判断,单独用映射类型能批量改结构,但组合起来才能应对复杂场景,比如“只提取对象里的函数属性”:
立即学习“Java免费学习笔记(深入)”;
- 先用条件类型识别函数:
type IsFunction<T> = T extends Function ? true : false; - 再用映射类型过滤并保留:
type FunctionProperties<T> = { [K in keyof T as IsFunction<T[K]> extends true ? K : never]: T[K] }; - 结果类型只含原对象中值为函数的键,其他全被剔除,且类型完全保留
注意几个关键细节
-
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]可批量加前缀

















