在 TypeScript 中,Omit 和 Record 是两个内置的高级工具类型,它们可以组合使用,以实现更灵活的类型操作。
基本概念
-
Record<K, T>:创建一个对象类型,其键为类型K,值为类型T。例如:
Record<'a' | 'b', string>表示一个对象,键只能是'a'或'b',值必须是string。 -
Omit<T, K>:从类型T中移除指定的键K,返回一个新类型。例如:
Omit<{name: string; age: number}, 'age'>得到{name: string}。
Omit Record 的典型用法
当你有一个基于 Record 定义的类型,并希望移除其中某些键时,就可以使用 Omit。
✅ 示例
ts
// 定义一个 Record 类型:用户 ID 映射到用户信息
type UserMap = Record<string, { id: number; name: string; password: string }>;
// 移除 password 字段,用于 API 响应脱敏
type SafeUserMap = Record<string, Omit<UserMap[string], 'password'>>;
// 等价于:
// type SafeUserMap = Record<string, { id: number; name: string }>;
🔍 解释
UserMap[string]提取Record的值类型,即{ id: number; name: string; password: string }。Omit<UserMap[string], 'password'>移除password,得到{ id: number; name: string }。- 外层再用
Record<string, ...>包裹,保持键仍为string类型。
实际应用场景
- API 脱敏:从包含敏感字段(如密码、token)的
Record类型中移除特定字段。 - 状态管理:在 Redux 或 Zustand 中,过滤掉不需要的属性以减少状态体积。
- 表单处理:提交表单时排除某些字段(如
createdAt、updatedAt)。
补充说明
Omit从 TypeScript 3.5+ 开始支持,需确保tsconfig.json中target≥ES2019。- 若需选择保留某些字段而非移除,可考虑使用
Pick。
如需进一步了解工具类型对比,可参考:TypeScript 工具类型实战指南。