在 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