使用其他属性扩充通用的部分计算类型,更改选项

时间:2018-01-10 16:38:27

标签: typescript types typescript2.6

我们的Angular 5应用程序以前共享一个单一类型的接口,用于检索使用后端更新对象。更新时,我们会将未更改的字段设置为后端稍后丢弃的魔术值。这意味着用户界面必须无需发送大量物品(魔术值很少是好的做法)。

我们通过重构更新操作来修复此问题,只发送已更改的字段以及用户提供的可选更改备注。此更改说明仅与更新操作相关,并且从不是主接口的一部分。

说明一下,我们可以获得<Person>

export interface Person {
  id: number;
  firstname: string;
  lastname: string;
  email: string;
  division: Division;
}

type Division = "BUSINESS" | "PROD" | "SALES";

现在,在更新Person的{​​{1}}时,最终的有效负载看起来像

division

因此,更新必须包含{ id: 12, division: "PROD", editNote: "Had enough of sales for the time being." } (存在于每个接口中且永远不可选),来自接口的一个或多个附加字段以及可选的id

我已经创建了一个mapped type partial,然后扩展了计算接口(似乎你不能在泛型类型中混合静态和计算字段):

editNote

但我真的不想这样做,因为我需要为我需要更新的每个接口显式声明一个新的“更新程序”接口。

有没有办法让等效的export type Updater<T> = { [prop in keyof T]?: T[prop]; }; export interface PersonUpdater extends Updater<Person> { id: number; editNote?: string; } 完全通用,比如

<PersonUpdater>

允许我将通用export interface Updater<T> = { id: number; editNote?: string; [prop in keyof T]?: T[prop]; }; 传递给我的服务吗?

1 个答案:

答案 0 :(得分:1)

您可以使用intersect中的Partial<>类型standard library添加的字段:

export type Updater<T> = {
  id: number;
  editNote?: string;
} & Partial<T>;

然后只需将PersonUpdater作为类型别名:

export type PersonUpdater = Updater<Person>;

或者如果你真的需要,作为一个界面:

export interface PersonUpdater extends Updater<Person> {};

希望有所帮助;祝你好运!