TypeScript的高级类型编程是类型系统深入应用的核心部分,它允许开发者通过已有的类型组合、变换出新的类型,实现更灵活的类型约束,让类型检查能够覆盖更多复杂的业务场景。

核心高级类型概念
条件类型
条件类型是TypeScript中类似三元表达式的类型语法,基本形式为T extends U ? X : Y,表示如果类型T可以赋值给类型U,那么结果类型为X,否则为Y。它常用于根据输入类型的不同返回不同的结果类型。
// 基础条件类型示例 type IsString<T> = T extends string ? true : false; type Test1 = IsString<string>; // 类型为 true type Test2 = IsString<number>; // 类型为 false // 条件类型结合泛型使用 type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; type Func = () => number; type Result = ReturnType<Func>; // 类型为 number
映射类型
映射类型允许开发者基于已有的类型,通过遍历其属性来创建新的类型,常见的映射类型有Readonly<T>、Partial<T>等,也可以自定义映射类型来满足特定需求。
// 自定义映射类型,将对象所有属性变为可选
type MyPartial<T> = {
[P in keyof T]?: T[P];
};
interface User {
name: string;
age: number;
}
type PartialUser = MyPartial<User>;
// PartialUser 类型为 { name?: string; age?: number; }
类型推断
类型推断使用infer关键字在条件类型中捕获待推断的类型,常用于提取函数返回值类型、数组元素类型等场景。
// 提取数组元素类型 type ElementType<T> = T extends (infer U)[] ? U : never; type NumArray = number[]; type NumElement = ElementType<NumArray>; // 类型为 number // 提取Promise返回值类型 type PromiseReturnType<T> = T extends Promise<infer U> ? U : T; type P = Promise<string>; type PResult = PromiseReturnType<P>; // 类型为 string
高级类型组合应用
实际开发中往往需要组合多种高级类型来实现复杂的类型约束,比如实现一个深度只读的类型,或者根据条件过滤对象属性。
// 深度只读类型
type DeepReadonly<T> = {
readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
};
interface NestedObj {
a: number;
b: {
c: string;
d: {
e: boolean;
};
};
}
type ReadonlyNested = DeepReadonly<NestedObj>;
// ReadonlyNested 的所有层级属性都为只读
实用开发场景
高级类型编程在组件库开发、工具函数类型定义等场景中非常实用,比如封装一个请求函数,根据传入的参数类型自动推断返回值的类型结构。
// 请求函数类型定义
type RequestConfig<T extends Record<string, any>> = {
url: string;
method: 'GET' | 'POST';
data?: T;
};
type RequestReturnType<T> = T extends 'GET' ? { code: number; data: any } : { code: number; msg: string };
function request<M extends 'GET' | 'POST', D extends Record<string, any> = {}>(
config: RequestConfig<D> & { method: M }
): RequestReturnType<M> {
// 实际请求逻辑
return {} as any;
}
// 调用时类型自动推断
const res1 = request({ url: '/api/get', method: 'GET' }); // res1 类型为 { code: number; data: any }
const res2 = request({ url: '/api/post', method: 'POST', data: { id: 1 } }); // res2 类型为 { code: number; msg: string }
注意事项
- 高级类型编程会增加类型的复杂度,不要为了使用高级类型而过度设计,优先满足业务需求。
- 复杂的类型定义建议添加清晰的注释,方便后续维护。
- 遇到类型报错时,可以通过
Ctrl+鼠标悬停查看类型的推导过程,快速定位问题。
TypeScript高级类型类型编程类型系统修改时间:2026-07-16 08:36:33