TypeScript 基础指南:条件类型(Conditional Types)

在 TypeScript 中,条件类型(Conditional Types)是一种基于类型判断条件返回不同类型的高级类型特性。它允许开发者根据输入类型做出动态的类型选择。

条件类型的基本语法如下:
SomeType extends OtherType ? TrueType : FalseType
在这个语法中:
SomeType 是要进行判断的类型。
OtherType 是用于比较的类型。
如果 SomeType 是 OtherType 的子类型,则返回 TrueType。
否则,返回 FalseType。
下面是一个简单的例子:
type Absolute<T> = `T` extends number ? number : never;

type A = Absolute<-5>; // type A = number
type B = Absolute<'hello'>; // type B = never
在这个例子中:
1.
我们定义了一个 Absolute 条件类型,它检查输入类型 T 是否为 number 类型。
2.
如果 T 是 number 类型,则返回 number 类型。
3.
否则,返回 never 类型。
4.
当我们使用 Absolute<-5> 时,得到 number 类型。而使用 Absolute<'hello'> 时,得到 never 类型。
条件类型的一些常见用途包括:
类型缩小
可以根据输入类型执行不同的类型检查和转换操作。
工具类型实现
可以实现 Pick、Omit 等常见的工具类型。
元编程
可以实现一些元编程功能,如推断函数返回类型等。
联合类型处理
可以根据联合类型的组成部分做出不同的类型选择。
下面是一个更复杂的例子,演示了条件类型在实际开发中的应用:
type Flatten<T> = T extends Array<infer U> ? U : T;

type A = Flatten<number[]>; // type A = number
type B = Flatten<string>; // type B = string
type C = Flatten<(number | string)[]>; // type C = number | string
在这个例子中:
1.
我们定义了一个 Flatten 条件类型,它检查输入类型 T 是否为数组类型。
2.
如果 T 是数组类型,则返回数组元素的类型 U。
3.
否则,直接返回 T。
4.
我们测试了三种情况。

总的来说,条件类型是 TypeScript 中一个非常强大的特性,它可以帮助开发者创建出更加灵活和复杂的类型系统。通过合理使用条件类型,开发者可以编写出更加健壮和可维护的代码。