为了更好的封装,我想创建一个包含多种其他类型的新类型。 entityService
应输入OakService
或MapleService
,其中应包含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的所有参数:(?)。
答案 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
。