Untitled

TypeScript 中的 Omit<T, K> 有什么用

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

先说结论：

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

让我们看看这段代码

Copy
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：

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

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

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

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

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

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