条件类型与 infer
约 332 字大约 1 分钟
布欧-Lewyon
2026-05-16
首页 › TypeScript › 高级类型 › 条件类型与 infer
基础条件类型
type IsString<T> = T extends string ? 'yes' : 'no';
type A = IsString<'hello'>; // "yes"
type B = IsString<42>; // "no"
// 分布式条件类型
type ToArray<T> = T extends any ? T[] : never;
type C = ToArray<string | number>; // string[] | number[]infer 关键字
infer 在条件类型中提取类型的某个部分:
// 提取数组元素类型
type ElementType<T> = T extends (infer U)[] ? U : never;
type E1 = ElementType<number[]>; // number
type E2 = ElementType<string[]>; // string
// 提取 Promise 内部类型
type Unwrap<T> = T extends Promise<infer U> ? U : T;
type F1 = Unwrap<Promise<string>>; // string
type F2 = Unwrap<number>; // number(非 Promise 不变)工具类型实现原理
// ReturnType
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
// Parameters
type MyParameters<T> = T extends (...args: infer P) => any ? P : never;
// Infer + 模板字面量
type ExtractName<T> = T extends `get${infer Name}` ? Name : never;
type G = ExtractName<'getUser'>; // "User"递归条件类型
// 展平嵌套数组
type Flatten<T> = T extends (infer U)[]
? U extends any[] ? Flatten<U> : U
: T;
type H = Flatten<number[][][]>; // number小结
| 语法 | 作用 |
|---|---|
T extends U ? X : Y | 条件判断 |
infer U | 在条件中提取类型 |
| 分布式条件类型 | 联合类型分别求值后合并 |
上一节:装饰器(TS 5.0+) 下一节:映射类型与模板字面量
