TypeScript 工具类型 Omit<T, K> 有什么用

9 个月前(已编辑)
/
4
这篇文章上次修改于 9 个月前,可能部分内容已经不适用,如有疑问可询问作者。

再学习 Nestjs 时,使用 TS 经常在 Respository 中见到 Omit<XXXEntity,'xxx'>的用法,因为以前没有用过,也不知道什么意思,就一直按着教程直接硬抄。 但是出现的频率实在太高了,觉得还是往下挖一挖,总不能一直搞不懂自己到底再写什么吧 - -!,所以还是点进源码看一看到底是什么东西~

先说结论:

Omit<T, K> 的作用是创建一个新的类型,该类型排除了类型 T 中指定的属性 K。

让我们看看这段代码

type Omit<T, K extends string | number | symbol> = {
  [P in Exclude<keyof T, K>]: T[P];
};
  • T 是原始类型,表示要操作的对象的类型。
  • K 是一个联合类型,表示要从 T 中排除的属性的类型。

首先,keyof T 是一个索引类型查询(Index Type Query),它返回类型 T 的所有属性名的联合类型。

然后,使用 Exclude<keyof T, K> 来排除属性 K,它返回 keyof T 中排除了 K 类型的属性名的联合类型。

最后,通过映射类型的语法[P in Exclude<keyof T, K>]: T[P],我们创建了一个新类型,该类型包含了 T 中除去属性 K 之外的所有属性,并且属性类型与原始类型 T 中对应属性的类型相同。

简而言之,Omit<T, K> 类型可以用来创建一个新类型,该类型排除了原始类型 T 中指定的属性 K。

例如,假设我们有一个类型 Person:

type Person = {
  name: string;
  age: number;
  email: string;
};

我们可以使用 Omit 类型来创建一个新类型 PersonWithoutEmail,该类型排除了 Person 类型中的 email 属性:

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

这样,PersonWithoutEmail 类型将只包含 name 和 age 属性,而不包含 email 属性。

const person: PersonWithoutEmail = {
  name: 'John',
  age: 30,
};

通过使用 Omit 类型,我们可以方便地创建一个新类型,以便从原始类型中排除指定的属性。

评论区加载中...