Typescript-具有数据模型接口的多态

时间:2019-07-17 01:26:14

标签: typescript interface polymorphism

我想我在这里寻找一种设计模式。这就是我所拥有的-

IApp.ts

export interface IApp {
   platform: PlatformEnum;
   version: string;
   islive: boolean;
   title: string;
   iconurl: string;
}

IAppleApp.ts

export interface IAppleApp extends IApp {
   buildversion: string;
   versionstatus: string;
   sku: boolean;
   category: string;
   accountid: string;
}

IAndroidApp.ts

export interface IAndroidApp extends IApp {
   versioncodes: string;
   track: string;
   rolloutpercentage: boolean;
   acccountname: string;
}

相当简单的模型来表示传入的数据,没什么花哨的。

现在,我有一个服务可以进行API调用,并以IApp的形式获取数据。

apps.service.ts

appVersion: IApp;
appiOSVersion: IAppleApp;
appAndroidVersion: IAndroidApp;

if (this.appVersion.platform === PlatformEnum.ios) {
   this.appiOSVersion = this.appVersion as IAppleApp;
} else if (this.appVersion.platorm === PlatformEnum.android) {
   this.appAndroidVersion = this.appVersion as IAndroidApp;
}

然后我在appsService.appiOSVersion组件中使用Apple,在appsService.appAndroidVersion组件中使用AndroidAppleAndroid组件都有不同的逻辑。我尝试在每个组件中使用appsService.appVersion,但是由于它是基本IApp类型,因此该对象不具有特定于平台的属性。因此必须使用两个不同的变量。

我的问题:是否可以在appsService.appVersionApple组件中重用Android? (为了状态管理,我需要将此变量放在apps.service.ts中)。有两个不同的变量并不疯狂,对吧?

抱歉,如果这没有道理。如果您需要更多详细信息,请告诉我。

非常感谢!

1 个答案:

答案 0 :(得分:1)

在什么时候设置this.appVersion.platform变量?您可以使用appService之类的泛型来参数化appsService.fetch<T>的fetch调用,并在调用时使用平台特定的接口对其进行参数化吗?

这样,如果您执行以下操作: appService.fetch<IAppleApp>(...) 您可以将返回类型设为通用T并访问该接口的结构。