我的应用程序中有一个界面,如下所示:
interface Team {
id: number;
name: string;
organization: Organization | number;
responsibilities: Responsibility[] | number[];
users?: User[] | number[];
}
organization
属性可以是表示该Organization
ID 的Organization
或number
。我以这种方式对其进行建模,以共享应用程序的前端和后端之间的接口。
创建团队时,organization
属性通常是一个数字,但是在显示团队时,它作为Organization
的实例从数据库中返回。这有效,但它会导致一些问题,我必须添加一大堆代码来确定属性是数字还是对象。
我想知道是否有一种方法可以在某些地方基本上说"这是一个Team
对象,其中organization
将始终是一个数字"或"这是一个Team
对象,其中organization
将始终是Organization
的实例。
我想我可以将上面的接口更改为TeamBase
,然后制作一个Team
,其中organization
是一个数字,另一个是Organization
的实例,但是当对象上有多个属性具有相同的问题时,这变得非常复杂(即同一Team
对象上的责任和用户)。
我解释的可能吗?有没有更好的方法来处理我正在做的事情?
您可以使用泛型来设置组织类型:
interface Team<TOrganization extends Organization | number> {
id: number;
name: string;
organization: TOrganization;
responsibilities: Responsibility[] | number[];
users?: User[] | number[];
}
然后是这样使用Team
类型的问题:Team<Organization>
或Team<number>
。
如果接口太长,有多种方法可以做到这一点。最核的方式(也是最不容易阅读的)可能是:
type OrgOrNum = Organization | number;
interface Team<T extends OrgOrNum> {
id: number;
name: string;
organization: T;
responsibilities: Responsibility[] | number[];
users?: User[] | number[];
}