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

19 浏览
0 Comments

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

我有一个接口,包含几个元素:

export interface Item {
  id: string;
  code: string;
  createdAt: string;
  updatedAt: string;
  level: number;
  seq: number;
  hasChildren: boolean;
  parentObject?: Item;
  children?: Item[];
}

我想要类似于`Partial`的东西,我在这里有了有用的发现:

[在Typescript接口中使所有属性可选](https://stackoverflow.com/questions/39713349/make-all-properties-within-a-typescript-interface-optional#40076355)

然而,我想要将一个字段变为必填项。我实现了以下内容:

export interface ItemUpdate extends Partial {
  id: string;
}

这样编译通过了。但是,我想要避免为每个接口都声明这个。为此,我将它更加通用化:

export interface UpdateOf extends Partial {
  id: string; // ID是更新时唯一需要的必填值
}

然而,这不再编译通过,返回以下错误:

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

我正在使用Angular 6.1.5,其中包含Typescript 2.9(据我所知)。

0
0 Comments

在 TypeScript 中,有一个问题是如何使一个泛型接口从另一个泛型接口继承。这个问题的出现是因为当前的规则是,一个类或接口只能继承具有静态已知成员的对象类型或对象类型的交集。这是因为编译器需要检查声明在类或接口中的属性的类型是否与基类型的相应属性的类型(如果有的话)兼容。而`Partial`的成员是静态已知的,而`Partial`的成员则不是。

在这个问题的开放的问题中,有人提出了一个解决方法。解决方案是使用交集类型而不是子接口。具体的代码如下:

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

通过使用交集类型,我们可以将`Partial`的成员与`{id: string}`这个额外的成员合并在一起,从而实现了泛型接口从另一个泛型接口继承的效果。这样,我们就能够在`UpdateOf`接口中使用`Partial`的成员,并且添加了一个额外的`id`属性。

这个解决方法有效地绕过了 TypeScript 中泛型接口继承的限制,并且能够实现我们想要的效果。希望在未来的 TypeScript 版本中,这个问题能够得到修复,并且可以更方便地实现泛型接口的继承。

0