在 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
,因此我们可以覆盖它的类型。
这比将我们需要的属性从类型复制到 上要好得多,因为我们仍然向代码的读者发出信号,表明这两种类型之间存在关系。
Person
T2
如果我们试图直接覆盖属性而不首先将其从类型中排除,我们会得到一个错误,因为两种类型的属性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', }, };