四、TypeScript 泛型与常用工具类型
泛型用于复用类型之间的关系,工具类型用于从已有类型生成新类型。它们能减少重复,也能保留具体的类型信息。
泛型:让输入与输出保持关联
1 | function first<T>(items: T[]): T | undefined { |
T 是类型参数,通常由调用参数推断。如果改成 any[],返回值也会失去类型信息。这里保留 undefined,因为数组可能为空。
泛型也常用于复用响应结构:
1 | interface Page<T> { |
泛型约束:extends 与 keyof
读取对象字段时,希望键必须存在,返回值也对应这个键:
1 | function getProperty<T, K extends keyof T>(value: T, key: K): T[K] { |
keyof T 取得键的类型,K extends keyof T 限制可选的键,T[K] 取得对应属性的类型。泛型的价值就在于保留这些关系,而不只是让参数接受更多类型。
常用工具类型
| 工具类型 | 用途 |
|---|---|
Partial<T> |
属性变为可选 |
Required<T> |
属性变为必填 |
Readonly<T> |
属性变为只读 |
Pick<T, K> / Omit<T, K> |
选取 / 排除对象属性 |
Record<K, V> |
描述键到值的映射 |
Exclude<T, U> / Extract<T, U> |
排除 / 保留联合类型成员 |
NonNullable<T> |
排除 null 与 undefined |
Parameters<T> / ReturnType<T> |
提取函数参数 / 返回值类型 |
工具类型只改变静态类型,不会修改实际数据。Partial、Readonly 默认只处理第一层;Omit 也不会从真实对象中删除字段。
从用户类型生成更新参数
1 | interface User { |
更新参数先用 Pick 选出允许修改的字段,再用 Partial 变成可选。实现中显式读取这些字段,避免把额外属性一起展开进结果。
用 Record 检查状态文案
1 | type Status = "loading" | "success" | "error"; |
有限的键可以检查遗漏。如果用 Record<string, User> 描述动态字典,实际查询仍可能不存在;可以将值类型写成 User | undefined,或开启 noUncheckedIndexedAccess。
从函数复用类型
1 | function createUser(name: string, age: number) { |
这里的 typeof 用于取得函数的类型。异步函数的 ReturnType 仍然是 Promise<...>,不会自动取出内部结果。
日常开发先熟悉这些内置工具;条件类型、infer 和复杂递归类型,等确有需求时再深入。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 HJ BLOG!





