如何使泛型 TypeScript 接口从另一个泛型接口扩展?

Posted

技术标签:

【中文标题】如何使泛型 TypeScript 接口从另一个泛型接口扩展?【英文标题】:How can I make a generic TypeScript interface extend from another generic interface? 【发布时间】:2019-04-06 04:59:40 【问题描述】:

我有一个界面,有几个元素:

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.

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于如何使泛型 TypeScript 接口从另一个泛型接口扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何使泛型代理类型与静态类型检查器一起使用

TypeScript泛型

TypeScript泛型

前端进阶-TypeScript高级类型 | 泛型约束泛型接口泛型工具类型

Typescript 别名泛型接口

来自接口实现的 Typescript 泛型推断