// 基础条件类型 type IsString<T> = T extendsstring ? true : false;
type A = IsString<'hello'>; // true type B = IsString<number>; // false
// 条件类型 + 泛型 type ExtractArrayType<T> = T extends (infer U)[] ? U : never;
type C = ExtractArrayType<string[]>; // string type D = ExtractArrayType<number[]>; // number type E = ExtractArrayType<number>; // never
infer 关键字
infer 用于在条件类型中声明一个待推断的类型变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 提取 Promise 返回值类型 type Unwrap<T> = T extendsPromise<infer R> ? R : T;
type F = Unwrap<Promise<string>>; // string type G = Unwrap<number>; // number(非 Promise,直接返回 T)
// 提取函数返回值类型(类似 ReturnType) type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
// 提取函数参数类型 type MyParameters<T> = T extends (...args: infer P) => any ? P : never;
// 递归提取嵌套 Promise type DeepUnwrap<T> = T extendsPromise<infer R> ? DeepUnwrap<R> : T; type H = DeepUnwrap<Promise<Promise<Promise<string>>>>; // string
分布式条件类型
当条件类型作用于裸类型参数时,会自动分发到联合类型的每个成员:
1 2 3 4 5
type ToArray<T> = T extendsany ? T[] : never;
type I = ToArray<string | number>; // 等价于 string[] | number[](分发给每个成员) // 不是 (string | number)[]!
如何阻止分发?用元组包裹:
1 2
type ToArrayNonDist<T> = [T] extends [any] ? T[] : never; type J = ToArrayNonDist<string | number>; // (string | number)[]