界面最佳实践

时间:2018-11-05 07:40:59

标签: angular typescript oop interface

我有一个来自数据库的对象,带有受让人和作者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;
}

3 个答案:

答案 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[];
}

因为用户可能有很多票证。