首页 > 解决方案 > 是否可以在打字稿界面中升级泛型?

问题描述

我有一堆服务被定义为

  export abstract class BaseService<T> {
      abstract getItem(id: string): T {}
  }


  export class FooService: BaseService<ADataModel> {
     getItem(id: string): ADataModel {} 
  }

当它在需要扩展的特定项目中被重用时ADatatModel,它工作得很好

  export class SubClassedDataModel extends ADataModel {
}

通常,扩展数据模型还需要扩展服务以考虑额外的字段,就像这样

export class SubClassedService extends FooService {
}

但是,使用扩展服务的项目中的语法变得有点乏味,因为我必须将返回值显式转换为SubClassedDataModel类型。

即想象FooService被提供为SubClassedService

 public myData: SubClassedDataModel;

 constructor(f: FooService) {
    this.myData = f.getItem('1') as SubClassedDataModel;
 }

问题:有没有办法告诉SubClassedService它应该将 T 视为SubClassedDataModel,同时保持任何其他引用完整?

即,如果另一个库服务使用FooService它,它仍应在该类型上工作MyDataModel,而扩展项目中 FooService 的任何访问器将其视为SubClassedDataModel

最好不要重新定义每个函数,或者在语法中添加额外的 pr-usage 代码。

基本上:我能做到吗:

 public myData: SubClassedDataModel;

 constructor(f: FooService) {
    this.myData = f.getItem('1');
 }

标签: angulartypescript

解决方案


推荐阅读