Angular 类型脚本继承和注入的构造函数参数
在以下继承场景中,使用Angular 5和TypeScript,是否可以不将Angular 类型脚本继承和注入的构造函数参数,angular,typescript,angular5,Angular,Typescript,Angular5,在以下继承场景中,使用Angular 5和TypeScript,是否可以不将MyService作为MyComponent的构造函数的参数 export class CBasic { // properties and methods } export class CAdvanced extends CBasic { // constructor constructor( public myService: MyService ) {
MyService
作为MyComponent
的构造函数的参数
export class CBasic {
// properties and methods
}
export class CAdvanced extends CBasic {
// constructor
constructor(
public myService: MyService
) {
// call constructor of super-class (required)
super();
}
// more properties and methods
}
export class MyComponent extends CAdvanced {
// constructor
constructor() {
// call constructor of super-class (required)
super(); // Error: [ts] Expected 1 arguments, but got 0.
}
}
我得到的错误是[ts]应为1个参数,但在MyComponent
中为0。
关键是我想在CAdvanced
中包含MyService
,以避免从它继承的类中的代码重复,例如MyComponent
您可以将可注入服务设为属性
export class CAdvanced {
@Inject(MyService)
public myService: MyService;
constructor() {
}
}
export class MyComponent extends CAdvanced {
constructor() {
super(); // no more error
}
}
Angular将通过@inject
装饰器将服务注入基类
或者,可以将参数设置为可选
这将使错误静音,但该值将是未定义的
export class CAdvanced {
constructor(public myService?: MyService) {
console.log(this.myService);
// above will print undefined
}
}
export class MyComponent extends CAdvanced {
constructor() {
super(); // no more error
}
}
MyComponent
中的构造函数是否执行其他操作?如果没有,您可以删除它。这与“多重继承”无关。@torazaburo谢谢,我已经从标题中删除了它。@ConnorsFan它可能还有其他作用。第一个解决方案很好,但让它成为可选的有什么意义,因为这将导致我不需要注入的服务?@torazaburo我不知道。OP说他得到了一个TypeScript错误,参数丢失了。将其设置为可选会抑制错误,并且我确实澄清了它将成为未定义的
。由OP决定他/她是否希望以这种方式修复错误。可能有些派生类具有参数,而有些派生类不具有参数。谁知道呢。与让Angular以常规方式为您的客户执行操作相比,您自己执行@Inject()
是否有任何缺点或缺陷?我似乎记得有一种方法可以直接在构造函数的参数列表中指定注入——这是一个选项吗?@torazaburo@Inject
装饰器是一个标准的角度特性。它可以在属性或构造函数参数中使用。Ex构造函数(@Inject(MyService)my:MyService)
。它用于无法通过参数类型推断DI类型的情况(即注入字符串)。您看不到对属性进行注入,因为所有示例都是通过参数进行的,但这样做没有什么错。从JavaScript代码来看,基本上是一样的。