在 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