TypeScript-Omit/Pick


Omit 的词源

Omit 是一个英语词汇,它的意思是“省略”或“遗漏”。现在让我们来看看这个词的词源。

词源分析
  • O-: 这是一个拉丁语前缀,表示“out of”或“from”。
  • Mit-: 这部分来自于拉丁语词根 mittere,意为“to send”或“to put”。
  • -er: 这是一个动词词尾,表示“to do”。

因此,omit 的字面意思可以理解为“送出”或“放置出去”,在英语中演变为“省略”或“遗漏”的意思。

词源历史
  • 拉丁语: mittere 意为“to send”或“to put”。从这个根词派生出了许多英语词汇,如 emit(发出)、commit(提交)等。
  • 中古英语: omit 最初出现在 15 世纪左右,源自古法语 ommettre,最终来源于拉丁语 omittre,这是一个由 o-mittere 组成的词,意为“to leave out”或“to fail to do”。

在 TypeScript 中的用法

在 TypeScript 中,Omit<T, K> 是一个实用类型,用于从类型 T 中删除(省略)指定的属性 K。这与英语词汇 omit 的含义紧密相关,即从一个对象类型中“省略”某些属性。

示例

假设我们有一个接口 Person

interface Person {
    name: string;
    age: number;
    email: string;
}

如果我们想要创建一个新的类型 PersonWithoutEmail,该类型与 Person 相同,但不包含 email 属性,我们可以使用 Omit 类型:

type PersonWithoutEmail = Omit<Person, 'email'>;

在这个例子中,PersonWithoutEmail 类型将包含 Person 中的所有属性,除了 email 属性。

Pick

在 TypeScript 中,Pick<T, K> 是一个实用类型,用于从类型 T 中选择一组属性 K,并创建一个新的类型,该类型仅包含这些被选择的属性及其类型。

语法

Pick<T, K>
  • T 是原始类型,通常是一个接口或类型。
  • K 是从 T 中选择的属性键的联合类型。

示例

假设我们有一个接口 Person

interface Person {
  name: string;
  age: number;
  address: string;
  phoneNumber: string;
}

如果我们想要创建一个新的类型 ContactInfo,该类型仅包含 nameaddress 属性,我们可以使用 Pick 类型:

type ContactInfo = Pick<Person, 'name' | 'address'>;

在这个例子中,ContactInfo 类型将包含 nameaddress 属性,而其他属性将被排除。

更复杂的示例

假设我们有一个更复杂的接口 User

interface User {
  id: number;
  name: string;
  email: string;
  password: string;
  roles: string[];
  settings: {
    theme: string;
    notifications: boolean;
  };
}

我们想要创建一个新的类型 UserPublicInfo,该类型仅包含 idnameemail 属性:

type UserPublicInfo = Pick<User, 'id' | 'name' | 'email'>;

现在 UserPublicInfo 类型将只包含 idnameemail 属性。

使用 Pick 和其他类型组合

Pick 类型可以与其他类型一起使用,例如与 OmitPartialRequired 等类型结合使用,以创建更复杂的类型。

假设我们想要创建一个新的类型 UserWithSettings,该类型包含 User 中的所有属性,但 settings 属性是必需的(即使在 User 中它是可选的):

type UserWithRequiredSettings = Pick<User, Exclude<keyof User, 'settings'>> & Required<Pick<User, 'settings'>>;

在这个例子中,我们使用 Exclude<keyof User, 'settings'> 来获取除了 settings 以外的所有属性键,然后使用 Pick 来选择这些属性。接着我们使用 Required 类型来确保 settings 属性是必需的。

实际应用场景

Pick 类型在实际开发中非常有用,尤其是在需要从一个大的接口中提取特定属性时。例如,假设你有一个 API 接口,需要向客户端返回用户信息的一部分:

interface User {
  id: number;
  name: string;
  email: string;
  password: string;
  roles: string[];
  settings: {
    theme: string;
    notifications: boolean;
  };
}

function getUserPublicInfo(user: User): Pick<User, 'id' | 'name' | 'email'> {
  return {
    id: user.id,
    name: user.name,
    email: user.email,
  };
}

在这个例子中,getUserPublicInfo 函数返回一个新的对象,该对象仅包含 idnameemail 属性,这有助于保护敏感信息,同时提供必要的用户信息。

Omit vs Pick

比较
目的:
Omit:用于从现有类型中排除某些属性。
Pick:用于从现有类型中选择某些属性。
结果:
Omit:创建一个不包含指定属性的新类型。
Pick:创建一个仅包含指定属性的新类型。
用法:
Omit:通常用于创建一个没有某些属性的新类型,这在需要排除某些敏感数据或不需要的字段时很有用。
Pick:通常用于创建一个包含特定属性的新类型,这在需要精简对象或传递特定属性集时非常有用。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值