1. 泛型的基本概念
- 泛型允许函数、类、接口在保持类型安全的同时支持多种类型
- 类型参数(如 T、K、V)是类型的"占位符",在调用时被具体的类型替换
- 泛型避免了使用 any 丢失类型信息,也避免了为每种类型编写重复代码
2. 泛型函数
- 基础用法:function identity<T>(arg: T): T { return arg; }
- 类型推断:调用时 TypeScript 通常能自动推断类型参数,如 identity(42) 中 T 被推断为 number
- 多个类型参数:function pair<T, U>(first: T, second: U): [T, U]
3. 泛型约束
- 使用 extends 关键字约束类型参数必须满足的条件
- 例如 function getLength<T extends { length: number }>(item: T): number 确保 T 具有 length 属性
- keyof 约束:function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] 确保 key 是 T 的合法属性名
4. 条件类型与 infer
- 条件类型根据类型关系选择分支:type IsArray<T> = T extends any[] ? true : false
- infer 关键字在条件类型中提取未知类型:type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never
- 条件类型会自动对联合类型进行分配(distributive)
5. 映射类型
- 遍历类型的每个属性并进行转换:type Readonly<T> = { readonly [K in keyof T]: T[K] }
- TypeScript 内置的工具类型(Partial、Required、Pick、Omit、Record 等)均基于映射类型实现
- 支持键重映射:type Getters<T> = { [K in keyof T as get${Capitalize<string & K>}]: () => T[K] }