如何使通用TypeScript接口从另一个通用接口扩展?

时间:2018-11-01 22:27:55

标签: typescript

我有一个界面,其中包含几个元素:

export interface Item {
  id: string;
  code: string;
  createdAt: string;
  updatedAt: string;
  level: number;
  seq: number;
  hasChildren: boolean;

  parentObject?: Item;
  children?: Item[];
}

我想要像Partial<T>这样的东西,我在这里很有帮助: Make all properties within a Typescript interface optional

但是,我想强制一个字段。我实现了这一点:

export interface ItemUpdate extends Partial<Item> {
  id: string;
}

并且编译良好。但是,我想避免为每个接口都声明它。为此,我使它更通用:

export interface UpdateOf<T> extends Partial<T> {
  id: string; // the ID is the only mandatory value for an update
}

但是,它不再编译,返回以下错误:

error TS2312: An interface may only extend a class or another interface.

我正在运行Angular 6.1.5,它附带Typescript 2.9(据我所知)。

1 个答案:

答案 0 :(得分:6)

错误消息已过期;有open issue进行更新。当前的规则是,类或接口只能扩展对象类型或对象类型与具有静态已知成员的对象的交叉点,因为编译器需要检查在类或接口中声明的属性类型是否为与基本类型的相应属性(如果有)的类型兼容。 Partial<Item>的成员是静态已知的,而Partial<T>的成员不是静态的。一种解决方法是使用交叉点类型而不是子接口:

export type UpdateOf<T> = Partial<T> & {id: string};