在学习 Nestjs 时,经常在 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 类型,我们可以方便地创建一个新类型,以便从原始类型中排除指定的属性。