如何导出多个类型别名?

时间:2018-03-14 12:08:32

标签: javascript angular typescript types casting

为了更好的封装,我想创建一个包含多种其他类型的新类型。 entityService应输入OakServiceMapleService,其中应包含TreeService

你可以在评论中看到一个可能的解决方案。如果我取消注释 garden.component.ts 中的导入并将TreeService替换为OakService | MapleService,它会起作用,但我想要某种父类型,包括所有类型。

tree.service.ts

import { OakService } from './oak.service';
import { MapleService } from './maple.service';

export type TreeService = typeof OakService | MapleService;

oak.service.ts

import { BaseService } from './base.service';

@Injectable()
export class OakService extends BaseService {
  constructor() {
    super();
  }
}

maple.service.ts

import { BaseService } from './base.service';

@Injectable()
export class MapleService extends BaseService {
  constructor() {
    super();
  }
}

garden.component.ts

// import { OakService } from './oak.service';
// import { MapleService } from './maple.service';
import { TreeService } from './parent.service';

@Component()
export class GardenComponent {
  constructor(
    protected entityService: TreeService // OakService | MapleService
  ) {}
}

balcony.component.ts

import { MapleService } from './maple.service';

export class BalconyComponent extends GardenComponent {   
  constructor(
    protected mapleService: MapleService
  ) {
    super(mapleService);   
  }
}
  

信息:上面的代码不起作用。您必须使用评论中的代码。我得到的错误不在 balcony.component.ts 内:   错误输入:无法解析... / garden.component.ts中的BaseListComponent的所有参数:(?)。

1 个答案:

答案 0 :(得分:1)

可注入类中的参数类型允许跳过TypeScript中的Angular @Inject装饰器,并注释构造函数以进行依赖注入。类型在运行时不存在,无法注入。

因此,

GardenComponent不能成为可行的组件。由于用作抽象类,因此不应该有@Component装饰器:

export abstract class GardenComponent {
  constructor(
    protected entityService: TreeService // OakService | MapleService
  ) {}
}

虽然子课程应该有@Component

@Component(...)
export class BalconyComponent extends GardenComponent {   
  constructor(mapleService: MapleService) {
    super(mapleService);
  }
}

构造函数在子类中是必需的,因为父类不包含正确的注释,并且它们的参数不应具有可见性修饰符,因为父构造函数已经分配了this.entityService