从 TypeScript 中的类型中排除属性

在 TypeScript 中从类型中排除属性

Exclude a Property from a Type in TypeScript

使用Omit实用程序类型从类型中排除属性,例如
type WithoutCountry = Omit<Person, 'country'>. 实用程序类型通过Omit从现有类型中删除指定的键来构造新类型。

索引.ts
type Person = { name: string; age: number; country: string; }; // 👇️ Type WithoutCountry = {name: string; age: number} type WithoutCountry = Omit<Person, 'country'>; const obj1: WithoutCountry = { name: 'Tom', age: 30, }; // 👇️ Type WithoutCountryAndAge = {name: string;} type WithoutCountryAndAge = Omit<Person, 'country' | 'age'>; const obj2: WithoutCountryAndAge = { name: 'Alfred', };

您还可以将
Omit
实用程序类型与接口一起使用。

索引.ts
interface Person { name: string; age: number; country: string; } // 👇️ Type WithoutCountry = {name: string; age: number} type WithoutCountry = Omit<Person, 'country'>; // 👇️ Type WithoutCountryAndAge = {name: string;} type WithoutCountryAndAge = Omit<Person, 'country' | 'age'>;

我们传递给的第一个类型Omit是我们将从中排除提供的一个或多个键的类型。

当您需要从一个类型中排除多个键时,请确保使用管道将它们分开|

您经常会看到Omit实用程序类型覆盖特定属性的类型。

索引.ts
type Person = { name: string; age: number; address: string; } // 👇️ Type T2 = {name: string; age: number; address: {country: string; city: string}} type T2 = Omit<Person, 'address'> & { address: { country: string; city: string; }; }; const obj1: T2 = { name: 'Tom', age: 30, address: { country: 'Chile', city: 'Santiago', }, };

在示例中,我们使用Omit实用程序类型从类型中排除address属性Person,因此我们可以覆盖它的类型。

这比将我们需要的属性从类型复制到 上要好得多,因为我们仍然向代码的读者发出信号,表明这两种类型之间存在关系。 PersonT2

如果我们试图直接覆盖属性而不首先将其从类型中排除,我们会得到一个错误,因为两种类型的属性address类型之间存在冲突。address

索引.ts
type Person = { name: string; age: number; address: string; }; // 👇️ Type T2 = {name: string; age: number; address: {country: string; city: string}} type T2 = Person & { address: { country: string; city: string; }; }; const obj1: T2 = { name: 'Tom', age: 30, // ⛔️ Error: Type '{country: string; city: string}' is not assignable to type 'string' address: { country: 'Chile', city: 'Santiago', }, };

发表评论