在 TypeScript 中,条件类型(Conditional Types)是一种根据类型条件选择不同类型的机制。extends 关键字在条件类型中用于表示一个类型是否满足特定条件。条件类型的基本语法如下:
T extends U ? X : Y
T:待检查的类型。
U:用于比较的类型。
X:如果 T 满足 U 的条件,则结果类型。
Y:如果 T 不满足 U 的条件,则结果类型。
定义条件类型
示例 1:基本的条件类型
type TrueType = true extends true ? 'Yes' : 'No'; // 'Yes'
type FalseType = false extends true ? 'Yes' : 'No'; // 'No'
在这个例子中:
true 确实可以 extends true,所以 TrueType 的结果是 'Yes'。
false 不可以 extends true,所以 FalseType 的结果是 'No'。
示例 2:基于泛型的条件类型
type IsString<T> = T extends string ? 'Yes' : 'No';
type Result1 = IsString<string>; // 'Yes'
type Result2 = IsString<number>; // 'No'
在这个例子中,IsString 是一个泛型条件类型:
- 当
T 是 string 时,结果是 'Yes'。
- 当
T 不是 string 时,结果是 'No'。
示例 3:复杂的条件类型
可以结合多个条件进行复杂的判断。
type IsStringOrNumber<T> = T extends string | number ? 'String or Number' : 'Other';
type Test1 = IsStringOrNumber<string>; // 'String or Number'
type Test2 = IsStringOrNumber<number>; // 'String or Number'
type Test3 = IsStringOrNumber<boolean>; // 'Other'
在这个例子中:
IsStringOrNumber 判断 T 是否是 string 或 number,结果是 'String or Number'。
- 否则,结果是
'Other'。
示例 4:条件类型与联合类型
type ElementType<T> = T extends (infer U)[] ? U : T;
type NumberArray = ElementType<number[]>; // number
type StringType = ElementType<string>; // string
在这个例子中:
ElementType 用于提取数组类型中的元素类型。
number[] 的元素类型是 number。
string 不是数组类型,因此 ElementType<string> 结果是 string。
条件类型的高级用法
条件类型的分布式条件类型:
- 当条件类型与联合类型一起使用时,条件类型会分布到联合的每个成员上。
type Distribute<T> = T extends any ? T : never;
type Result = Distribute<'a' | 'b'>; // 'a' | 'b'
在这个例子中,Distribute 将条件类型 T extends any ? T : never 应用于 'a' | 'b',结果是 'a' | 'b'。
递归条件类型:
- 条件类型也可以用于递归类型的处理,例如构建深度递归类型。
type Flatten<T> = T extends (infer U)[]
? U extends any[]
? Flatten<U>
: U
: T;
type Result1 = Flatten<number[]>; // number
type Result2 = Flatten<number[][][]>; // number