typescript高级类型通过交叉、联合、条件、映射及递归等特性,实现灵活的类型组合与逻辑判断,提升代码安全性与复用性。

TypeScript 的类型系统远不止基础类型标注。通过高级类型特性,开发者可以构建更安全、可复用且智能的代码结构。掌握这些能力,能让你在复杂项目中游刃有余。
交叉类型与联合类型:灵活组合类型
交叉类型(&)将多个类型合并为一个,常用于混入(mixin)或扩展对象结构。
例如:
联合类型(|)表示值可以是多种类型之一。结合类型收窄(如 typeof、in、instanceof),可在运行时做出安全判断。
比如:
function padLeft(value: string, padding: string | number) {if (typeof padding === "number") { ... }else { ... }}
条件类型:类型层面的逻辑判断
条件类型让类型具备“if-else”能力,格式为 T extends U ? X : Y,适用于根据输入类型动态决定输出类型。
常见用途包括:
- 过滤特定类型:
type NonNULLable<t> = T extends null | undefined ? never : T;</t> - 映射不同输入:
type ToArray<t> = T extends any[] ? T : T[];</t>
例如提取函数返回值:
type ReturnType<t> = T extends (...args: any[]) => infer R ? R : any;</t>
映射类型:批量修改对象属性
映射类型基于已有类型创建新类型,通过遍历属性实现批量操作。
内置工具如:
-
Partial<T>:所有属性变为可选 -
Readonly<T>:所有属性变为只读 -
Pick<T, K>:从 T 中挑选部分属性 K
你也可以自定义映射规则。
比如将所有字段设为可选且可为 null:
type MaybeOptional<t> = {</t>[P in keyof T]?: T[P] | null;};
类型递归与分布式条件类型
TypeScript 支持递归定义类型,可用于处理嵌套结构。
例如深只读类型:
type DeepReadonly<T> = {readonly [P in keyof T]: T[P] extends Object ? DeepReadonly<T[P]> : T[P];};
当条件类型作用于联合类型时,会自动分发到每个成员,称为“分布式条件类型”。
这意味着:
type TypeName<T> = T extends string ? "string" : T extends number ? "number" : "other";type Result = TypeName<string | number>; // 得到 "string" | "number"
基本上就这些。熟练运用这些高级类型,能让 TypeScript 成为你代码的智能助手,而不是负担。


