1
头图

TypeScript中的Omit与Pick:何时使用

原文链接:https://dev.to/codeparrot/typescript-omit-vs-pick-when-to-use-what-4n72
作者:CodeParrot
译者:倔强青铜三

前言

大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!

TypeScript是一种强大的语言,允许你创建复杂的数据结构和类型。它用于创建比any更具体的数据类型。TypeScript的两个特别有用的特性是OmitPick,它们通过排除或包含特定属性来帮助我们创建更精确的类型。这有助于我们在编译时捕获错误,使代码更加健壮。

在使用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类型中排除了passwordpasswordSalt属性。这有助于我们在将数据发送到客户端之前清理数据。

表单验证

当你创建表单时,你通常需要从表单数据中排除某些属性。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类型中排除了passwordcreatedAtupdatedAt属性。这有助于我们简化类型并使其更易于使用。

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的比较

特性OmitPick
目的从类型中排除指定的属性仅从类型中包含指定的属性
语法Omit<Type, Keys>Pick<Type, Keys>
结果创建一个包含所有属性(除了指定的)的类型创建一个仅包含指定属性的类型
使用场景当你想要移除特定属性时当你想要保留特定属性时
属性选择定义要排除的属性定义要包含的属性
类型安全性维护剩余属性的类型安全性维护所选属性的类型安全性

结论

在本文中,我们了解了如何使用TypeScript OmitPick通过从现有类型中排除或包含特定属性来创建新类型。我们还探索了这些工具的一些实际用例。

通过了解如何使用OmitPick,你可以在TypeScript代码中创建更灵活、更健壮的类型。

希望这篇文章对你有所帮助,你学到了新东西。要了解更多关于TypeScript OmitPick以及一些其他工具类型的信息,你可以查看TypeScript文档。

最后感谢阅读!欢迎关注我,微信公众号倔强青铜三。欢迎点赞收藏关注,一键三连!!!

倔强青铜三
36 声望0 粉丝