附录 A:常用类型工具(Utility Types)参考
TypeScript 提供了一组内置的 类型工具(Utility Types),这些工具可以帮助开发者以简洁、可重用的方式操作和转换类型。这些类型是全局可用的,能够增强类型安全性并减少样板代码。本附录涵盖了最常用的类型工具及其用途、示例和实际应用场景。
1. Partial<T>
将类型 T 的所有属性变为可选。
语法
Partial<T>
示例
interface 用户 {
姓名: string;
年龄: number;
邮箱: string;
}
const 部分用户: Partial<用户> = { 姓名: "Alice" }; // 有效,其他属性是可选的
使用场景
适用于更新对象时,只需提供部分字段的情况,例如表单的局部更新。
2. Required<T>
将类型 T 的所有属性变为必填(与 Partial 相反)。
语法
Required<T>
示例
interface 可选用户 {
姓名?: string;
年龄?: number;
}
const 必填用户: Required<可选用户> = { 姓名: "Bob", 年龄: 25 }; // 所有字段必须提供
使用场景
确保所有可选属性都被填充,例如在最终确定配置对象时。
3. Readonly<T>
将类型 T 的所有属性设为只读。
语法
Readonly<T>
示例
interface 配置 {
接口密钥: string;
端点: string;
}
const 只读配置: Readonly<配置> = { 接口密钥: "xyz", 端点: "/api" };
// 只读配置.接口密钥 = "abc"; // 错误:无法分配到“接口密钥”,因为它是只读属性
使用场景
防止意外修改对象,例如常量或不可变数据。
4. Pick<T, K>
从类型 T 中挑选一组属性 K,生成新类型。
语法
Pick<T, K extends keyof T>
示例
interface 个人信息 {
姓名: string;
年龄: number;
地址: string;
}
const 个人信息概要: Pick<个人信息, "姓名" | "年龄"> = { 姓名: "Charlie", 年龄: 30 }; // 仅包含姓名和年龄
使用场景
提取特定字段,用于简化对象视图,例如在 API 或 UI 组件中。
5. Omit``
从类型 T 中排除属性 K,生成新类型。
语法
Omit<T, K extends keyof any>
示例
interface 用户资料 {
编号: number;
姓名: string;
密码: string;
}
const 公开资料: Omit<用户资料, "密码"> = { 编号: 1, 姓名: "Dave" }; // 不包含密码
使用场景
移除敏感或不必要的字段,例如在公开分享数据时。
6. Record<K, T>
创建一个键为类型 K、值为类型 T 的类型。
语法
Record<K extends keyof any, T>
示例
const 分数: Record<string, number> = {
Alice: 95,
Bob: 87,
};
type 状态 = "活跃" | "非活跃";
const 用户状态: Record<状态, string> = {
活跃: "用户在线",
非活跃: "用户离线",
};
使用场景
定义具有特定键值约束的字典或映射,例如配置表。
7. Exclude<T, U>
从类型 T 中排除可赋值给 U 的类型。
语法
Exclude<T, U>
示例
type 状态 = "成功" | "错误" | "加载中";
type 非错误状态 = Exclude<状态, "错误">; // "成功" | "加载中"
使用场景
过滤掉不需要的联合类型成员,例如从状态类型中移除错误状态。
8. Extract<T, U>
从类型 T 中提取可赋值给 U 的类型。
语法
Extract<T, U>
示例
type 操作 = "读取" | "写入" | "删除" | string;
type 读写操作 = Extract<操作, "读取" | "写入">; // "读取" | "写入"
使用场景
隔离特定的联合类型成员,例如在权限系统中提取特定操作。
9. NonNullable<T>
从类型 T 中排除 null 和 undefined。
语法
NonNullable<T>
示例
type 可能字符串 = string | null | undefined;
const 确定字符串: NonNullable<可能字符串> = "Hello"; // 仅允许字符串
使用场景
确保值已定义,例如在空值检查或验证之后。
10. Parameters<T>
提取函数类型 T 的参数类型,以元组形式返回。
语法
Parameters<T extends (...args: any) => any>
示例
type 日志函数 = (级别: string, 消息: string) => void;
type 日志参数 = Parameters<日志函数>; // [string, string]
使用场景
用于类型安全的函数参数处理或中间件创建。
11. ReturnType<T>
提取函数类型 T 的返回类型。
语法
ReturnType<T extends (...args: any) => any>
示例
type 获取用户 = () => { 编号: number; 姓名: string };
type 用户 = ReturnType<获取用户>; // { 编号: number; 姓名: string }
使用场景
捕获函数的输出类型,例如用于 API 响应类型定义。
12. Awaited<T>
递归解包 Promise 类型,获取解析后的值类型。
语法
Awaited<T>
示例
type 获取结果 = Promise<Promise<string>>;
type 结果 = Awaited<获取结果>; // string
使用场景
简化异步操作的类型定义,尤其是处理嵌套 Promise 时。
总结表格
| 类型工具 | 用途 | 示例输入 | 示例输出 |
|---|---|---|---|
Partial<T> | 所有属性变为可选 | { a: string; b: number } | { a?: string; b?: number } |
Required<T> | 所有属性变为必填 | { a?: string } | { a: string } |
Readonly<T> | 所有属性设为只读 | { a: string } | { readonly a: string } |
Pick<T, K> | 挑选特定属性 | { a: string; b: number }, "a" | { a: string } |
Omit<T, K> | 排除特定属性 | { a: string; b: number }, "b" | { a: string } |
Record<K, T> | 创建键值对类型 | `"x" | "y", number` |
Exclude<T, U> | 排除可赋值类型 | `"a" | "b" |
Extract<T, U> | 提取可赋值类型 | `"a" | "b" |
NonNullable<T> | 排除 null 和 undefined | `string | null` |
Parameters<T> | 提取函数参数类型 | (x: number) => void | [number] |
ReturnType<T> | 提取函数返回类型 | () => string | string |
Awaited<T> | 解包 Promise 类型 | Promise<string> | string |
