Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 类型脚本继承和注入的构造函数参数_Angular_Typescript_Angular5 - Fatal编程技术网

Angular 类型脚本继承和注入的构造函数参数

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 ) {

在以下继承场景中,使用Angular 5和TypeScript,是否可以不将
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代码来看,基本上是一样的。