TypeScript中的Omit与Pick:何时使用
原文链接:https://dev.to/codeparrot/typescript-omit-vs-pick-when-to-use-what-4n72
作者:CodeParrot
译者:倔强青铜三
前言
大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
TypeScript是一种强大的语言,允许你创建复杂的数据结构和类型。它用于创建比any
更具体的数据类型。TypeScript的两个特别有用的特性是Omit
和Pick
,它们通过排除或包含特定属性来帮助我们创建更精确的类型。这有助于我们在编译时捕获错误,使代码更加健壮。
在使用TypeScript类型时,你经常会遇到需要基于现有类型创建新类型的情况。TypeScript为此提供了两个强大的工具类型:Omit
通过排除特定属性来帮助你创建类型,而Pick
则允许你通过选择所需的属性来构建类型。让我们探索这些工具,看看它们如何改进你的TypeScript代码。
TypeScript Omit是什么?
Omit
工具是一个TypeScript类型,允许你通过从现有类型中排除一个或多个属性来创建新类型。它是处理复杂数据结构和确保代码尽可能清晰可读的强大工具。
Omit<Type, Keys>
通过从Type
中选择所有属性,除了在Keys
中指定的属性,来创建一个新类型。可以将其视为类型的“属性擦除器”。
如何使用TypeScript Omit
要使用Omit
,你需要从@type
包中导入它。以下是一个示例:
TypeScript复制
interface User {
id: number;
username: string;
password: string;
email: string;
}
// 创建一个不包含敏感信息的公共用户类型
type PublicUser = Omit<User, "password">;
const user: PublicUser = {
id: 1,
username: "codewizard",
email: "wizard@code.com"
// 没有密码属性!✨
};
在这个示例中,PublicUser
是一个新类型,它包含User
的所有属性,除了password
。这种类型的定义有助于我们保护敏感信息不被暴露等。
Omit可能有用的几个地方
API响应清理
当你使用API时,你通常需要清理响应以删除任何敏感信息。Omit可以通过排除你不想暴露的属性来帮助你做到这一点,并且可以在将数据发送到客户端之前帮助你清理数据:
TypeScript复制
interface DatabaseUser {
id: number;
username: string;
password: string;
passwordSalt: string;
email: string;
lastLogin: Date;
}
// 为客户端使用移除敏感字段
type ClientUser = Omit<DatabaseUser, "password" | "passwordSalt">;
function sanitizeUser(user: DatabaseUser): ClientUser {
// TypeScript确保我们不包括敏感字段
const { password, passwordSalt, ...clientUser } = user;
return clientUser;
}
在这里,我们创建了一个ClientUser
类型,它从DatabaseUser
类型中排除了password
和passwordSalt
属性。这有助于我们在将数据发送到客户端之前清理数据。
表单验证
当你创建表单时,你通常需要从表单数据中排除某些属性。Omit可以通过排除你不想包含在表单中的属性来帮助你做到这一点。
TypeScript复制
interface ProductForm {
name: string;
price: number;
createdAt: Date;
updatedAt: Date;
computedTax: number;
}
// 只包含可编辑字段
type EditableProductFields = Omit<ProductForm, "createdAt" | "updatedAt" | "computedTax">;
function updateProduct(id: number, updates: EditableProductFields) {
// 只允许更新名称和价格
// ...
}
简化派生类型
Omit还可以用于简化派生类型。例如,如果你有一个包含许多属性的类型,但你只需要其中的子集,你可以使用Omit来创建一个只包含你需要的属性的新类型:
TypeScript复制
type User = {
id: number;
username: string;
password: string;
email: string;
createdAt: Date;
updatedAt: Date;
};
// 创建一个不包含不必要的属性的简化类型
type UserWithoutPassword = Omit<User, "password" | "createdAt" | "updatedAt">;
在这个示例中,UserWithoutPassword
是一个新类型,它从User
类型中排除了password
、createdAt
和updatedAt
属性。这有助于我们简化类型并使其更易于使用。
TypeScript Pick是什么?
Pick是一个TypeScript工具,允许你从类型中选择特定的属性。它与Omit类似,但不是排除属性,而是只包括在第二个参数中指定的属性。
Pick<Type, Keys>
通过从Type
中选择在Keys
中指定的属性来创建一个新类型。
如何使用Pick
要使用Pick,你需要从@type
包中导入它。以下是一个示例:
TypeScript复制
interface User {
id: number;
username: string;
password: string;
email: string;
}
// 创建一个只包含指定属性的新类型
type UserWithEmail = Pick<User, "email">;
在这个示例中,UserWithEmail
是一个新类型,它只包含User
类型的email
属性。当你只需要类型的一个子集时,这非常有用。
Omit与Pick的比较
特性 | Omit | Pick |
---|---|---|
目的 | 从类型中排除指定的属性 | 仅从类型中包含指定的属性 |
语法 | Omit<Type, Keys> | Pick<Type, Keys> |
结果 | 创建一个包含所有属性(除了指定的)的类型 | 创建一个仅包含指定属性的类型 |
使用场景 | 当你想要移除特定属性时 | 当你想要保留特定属性时 |
属性选择 | 定义要排除的属性 | 定义要包含的属性 |
类型安全性 | 维护剩余属性的类型安全性 | 维护所选属性的类型安全性 |
结论
在本文中,我们了解了如何使用TypeScript Omit
和Pick
通过从现有类型中排除或包含特定属性来创建新类型。我们还探索了这些工具的一些实际用例。
通过了解如何使用Omit
和Pick
,你可以在TypeScript代码中创建更灵活、更健壮的类型。
希望这篇文章对你有所帮助,你学到了新东西。要了解更多关于TypeScript Omit
和Pick
以及一些其他工具类型的信息,你可以查看TypeScript文档。
最后感谢阅读!欢迎关注我,微信公众号:倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。