TypeScript 强制接口属性为两种可能的类型之一



我的应用程序中有一个界面,如下所示:

interface Team {
id: number;
name: string;
organization: Organization | number;
responsibilities: Responsibility[] | number[];
users?: User[] | number[];
}

organization属性可以是表示该OrganizationID 的Organizationnumber。我以这种方式对其进行建模,以共享应用程序的前端和后端之间的接口。

创建团队时,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[];
}

最新更新