【问题标题】:Best practice for interface接口的最佳实践
【发布时间】:2019-04-08 13:30:03
【问题描述】:
我有一个来自数据库的对象,带有受让人和作者 ID,这当然是指用户对象。由于我以数字开头并以用户对象结尾,所以我的问题是,作者的类型是否应该类似于 number |用户,或者我应该使用新属性扩展界面(作者:用户,受让人:用户)。或者也许有更好的第三种解决方案?我对 OOP 比较陌生,所以我对这里的最佳做法有点困惑,我似乎找不到任何答案。
这是我在数据库中的对象:
export interface Ticket {
id: number;
status: ETICKET_STATUS_S;
date: Date;
subject: string;
body: string;
authorId: number;
type: number;
category: number;
assigneeId: number;
priority: ETICKET_PRIORITY_S;
severity: ETICKET_SEVERITY_S;
}
export interface User {
id: number;
uid: string;
type: EUserType_S;
name: string;
telephone: string;
email: string;
locale: ELOCALE_S;
}
【问题讨论】:
标签:
angular
typescript
oop
interface
【解决方案1】:
我会说最好将 ID 和对象分成两个不同的属性,而不是与联合类型共享一个属性。这是因为它消除了对type guards 的需求,这只是额外的逻辑,会使您的代码混乱并使其容易出现更多错误。
第三种解决方案是使用例如一个名为DbTicket 的接口,它具有来自数据库的原始值,另一个名为Ticket 的接口具有User 类型的属性。然后,您只需在拥有 User 对象时进行转换。
【解决方案2】:
如果我理解正确,AuthorId 就是写票的用户的 ID。这里不需要更改作者 ID 的类型,因为它只是对编写它的用户的引用。
如果您从 OOP 的角度考虑票证,您就是在尝试描述票证属性。因此,工单将包含作者姓名,但不一定包含有关用户的其他信息。
以汽车为例,如果您有汽车界面,您可能想说汽车有 4 个轮子、1 个发动机等等。您也可能想要命名汽车的所有者。所以说乔的车。但是您不希望在汽车界面中出现 Joe 的其他属性,例如他的眼睛颜色、头发颜色、手指数量等……而宁愿在描述驾驶员的界面中使用。
【解决方案3】:
作者的类型应该是数字吗?用户
否定:这将需要在您的 Web 应用程序中实现所有内容以处理数字大小写和对象大小写,从而导致大量开发开销并由于不必要的复杂性增加而导致许多可能的错误。
我是否应该使用新属性扩展接口(作者:用户,受让人:用户)
是的!这是正确的解决方案,直接链接到对象。如果在获取更多详细信息之前您只有用户 ID 号,那么您可以将其存储在您的对象中,如下所示:
{
id: 1;
status: "BOOKED";
date: "10-05-2018";
...
user: {
id: 1;
}
}
所以你的ticket对象可以填充数据和user对象,ticket对象下只能有ID属性,直到取到数据。
此时我想指出,在不了解您要实现的所有业务的情况下,在您的情况下,像这样组织您的对象可能更有意义:
export interface Ticket {
id: number;
status: ETICKET_STATUS_S;
...
}
export interface User {
id: number;
...
tickets: Ticket[];
}
因为一个用户可能有很多票。