十一、泛型和类型体操
泛型和类型体操(Type Gymnastics)是 TypeScript 中高级类型系统的重要组成部分。它们提供了强大的工具和技巧,用于处理复杂的类型操作和转换。
1.泛型(Generics)
1) 泛型函数
泛型函数允许我们在函数定义中使用类型参数,以便在函数调用时动态指定类型。例如:
function identity(arg: T): T { return arg;} let result = identity(42); // result 的类型为 number
在上面的示例中,identity 函数使用类型参数 T,并返回与输入类型相同的值。通过显式传递泛型参数,我们可以确保在函数调用时指定了具体的类型。
2) 泛型接口
泛型接口允许我们在接口定义中使用类型参数,以便在实现该接口时指定具体的类型。例如:
interface Container { value: T;} let container: Container = { value: 42 };
在上面的示例中,我们定义了一个泛型接口 Container,它包含一个类型参数 T。通过指定 Container,我们创建了一个具体的实现,其中的 value 属性类型为 number。
3) 泛型类
泛型类允许我们在类定义中使用类型参数,以便在创建类的实例时指定具体的类型。例如:
class Stack { private items: T[] = []; push(item: T) { this.items.push(item); } pop(): T | undefined { return this.items.pop(); }} let stack = new Stack(); stack.push(1); stack.push(2);let item = stack.pop(); // item 的类型为 number | undefined
在上面的示例中,我们定义了一个泛型类 Stack,它使用类型参数 T 来表示堆栈中的元素类型。通过创建 Stack 的实例,我们限制了堆栈中的元素必须为 number 类型。
- 类型体操(Type Gymnastics)
1) 条件类型(Conditional Types)
条件类型允许我们根据输入类型的条件判断结果来选择不同的类型。条件类型的语法形式为:
T extends U ? X : Y
其中,T 是待检查的类型,U 是条件类型,X 是满足条件时返回的类型,Y 是不满足条件时返回的类型。
下面是一个使用条件类型的示例:
type Check = T extends string ? true : false; type Result = Check; // Result 的类型为 true
在上面的示例中,我们定义了一个条件类型 Check,它接受一个类型参数 T。如果 T 是 string 类型,那么 Check 的类型将是 true,否则为 false。
带你读《现代TypeScript高级教程》十一、泛型和类型体操(2)https://developer.aliyun.com/article/1348496?groupCode=tech_library