接口只能扩展对象类型或对象类型的交集
An interface can only extend an object type or intersection of object types
当我们尝试在接口中扩展非对象或非静态类型时,会出现错误“接口只能扩展对象类型或对象类型与静态已知成员的交集”。
要解决此错误,请使用具有交集类型的类型别名。
下面是错误如何发生的示例。
索引.ts
type CountryOrSalary = { country: string } | { salary: number }; // ⛔️ An interface can only extend an object type or // intersection of object types with statically known members.ts(2312) interface Employee extends CountryOrSalary { id: number; name: string; }
我们只能扩展对象类型或对象类型与静态已知成员的交集,而联合类型不是静态已知的。
使用类型别名和交集类型来解决错误
要解决该错误,请改用带有交集类型的类型别名。
索引.ts
type CountryOrSalary = { country: string } | { salary: number }; type Emp = CountryOrSalary & { id: number; name: string; }; const emp: Emp = { id: 1, name: 'Bobby Hadz', country: 'Germany', salary: 100, };
交集类型是使用&
运算符定义的,用于组合现有的对象类型。
索引.ts
type A = { a: string; }; type B = { b: string; }; // type Combined = { // a: string; // b: string; // } type Combined = A & B; const combined: Combined = { a: 'bobby', b: 'hadz', };
交叉类型允许我们通过扩展来构建新类型,并且最常用于组合现有的对象类型。
使用交集类型而不是联合
或者,我们可以更改第一个示例以使用交集类型而不是并集。
索引.ts
type CountryAndSalary = { country: string } & { salary: number }; interface Employee extends CountryAndSalary { id: number; name: string; } const emp: Employee = { id: 1, name: 'Bobby Hadz', country: 'Germany', salary: 100, };
该CountryAndSalary
类型与 2 个对象类型相交以生成一个具有这两种对象类型的所有成员的新类型。
这与使用联合类型的第一个示例的含义不同,因为
country
和salary
属性都是必需的。但是,它确实说明了如何将联合类型更改为交集类型来解决错误。
我还写了一篇关于
如何检查对象是否实现接口的文章。
如果您需要创建基于接口的对象,请单击
以下链接。