我们的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];
};
传递给我的服务吗?
答案 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> {};
希望有所帮助;祝你好运!