我有一个来自数据库的对象,带有受让人和作者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;
}
答案 0 :(得分:1)
我想最好将ID和对象分成两个不同的属性,而不是使用联合类型共享属性。这是因为它消除了对type guards的需要,这只是多余的逻辑,会使您的代码混乱,并易于出现更多错误。
第三种解决方案是,例如,使用一个具有数据库原始值的名为DbTicket
的接口,以及一个具有类型{{1}的属性的名为Ticket
的接口。 }。然后,您只有在拥有User
对象时才进行转换。
答案 1 :(得分:0)
如果我理解正确,那么AuthorId就是写票证的用户的ID。在这里,您无需更改作者ID的类型,因为它只是对编写它的用户的引用。
如果您根据OOP来考虑故障单,则尝试描述故障单属性。因此,票证将包含作者姓名,但不一定包含有关用户的其他信息。
一个例子是考虑一辆汽车,如果您有汽车接口,则可能要说汽车有4个轮子,1个发动机等。您也可能想命名汽车的所有者。所以说乔的车。但是您不希望Joe在汽车界面中具有其他属性,例如他的眼睛颜色,头发颜色,手指数量等,而宁愿进入描述驾驶员的界面中。
答案 2 :(得分:0)
作者的类型应该像数字|用户
否定的:这将需要在Web应用程序中实现所有功能,以处理数字大小写和对象大小写两种情况,这导致大量的开发开销,并且由于不必要的复杂性增加而导致许多可能的错误。 / p>
我应该使用新属性(作者:用户,受让人:用户)扩展界面
是的!这是正确的解决方案,直接链接到该对象。如果在获取更多详细信息之前只有用户ID号,则可以将其存储在对象中,如下所示:
{
id: 1;
status: "BOOKED";
date: "10-05-2018";
...
user: {
id: 1;
}
}
因此您的票证对象可以填充数据,而用户对象在票证对象下只能具有ID属性,直到提取数据为止。
在这一点上,我想指出,在不了解您要实现的所有业务的情况下,按照您的情况来组织这样的对象可能更有意义:
export interface Ticket {
id: number;
status: ETICKET_STATUS_S;
...
}
export interface User {
id: number;
...
tickets: Ticket[];
}
因为用户可能有很多票证。