Angular 如何使“有棱角”;见;注入useClass的子服务中的方法?

Angular 如何使“有棱角”;见;注入useClass的子服务中的方法?,angular,typescript,inheritance,service,web-component,Angular,Typescript,Inheritance,Service,Web Component,我有一堆角度组件,它们的代码基本相同,所以我创建了一个组件来包含重复的代码,主要是处理后端数据和表单中数据的通用方法。为此,我必须创建一个抽象服务,因为每个表单都使用自己的服务,尽管它们非常相似 “父”组件调用处理服务中数据的方法(子组件扩展父组件,尽管它不是抽象的),在子组件中创建服务的方式是注释@component对子服务有一个“useClass”,因此它被创建为父服务,例如提供:MotherService,useClass:ChildService(“MotherService”是一个抽象

我有一堆角度组件,它们的代码基本相同,所以我创建了一个组件来包含重复的代码,主要是处理后端数据和表单中数据的通用方法。为此,我必须创建一个抽象服务,因为每个表单都使用自己的服务,尽管它们非常相似

“父”组件调用处理服务中数据的方法(子组件扩展父组件,尽管它不是抽象的),在子组件中创建服务的方式是注释@component对子服务有一个“useClass”,因此它被创建为父服务,例如提供:MotherService,useClass:ChildService(“MotherService”是一个抽象类,它声明了公共组件中使用的所有方法,“ChildService”扩展了它并正确地实现了它的方法)

问题是,在其中一个组件上,我正在从父组件进行扩展,我必须从服务中调用一些额外的方法,因为它使用来自DB的多个表,父服务只处理一个主表。 我在上述方法中调用了super,然后添加了所需的其余代码,使用子服务专用的方法。代码按预期工作,但终端为每个调用的方法(仅来自子服务)提供了一个错误:

ERROR in src/app/.../child/child.component.ts(63,8): error TS2339: Property 'methodThatMotherDoesntHave' does not exist on type 'MotherService'.
代码正常运行,但似乎Angular希望父服务调用所有方法,因为调用它的函数是从父组件本身的代码中调用的,我猜?!?甚至VS代码也以红色显示了这些方法,并建议需要创建它们(“属性“methodThatMotherDoesntHave”在类型“MotherService”上不存在”)。我怎样才能“声明”这个方法存在于子服务中,而子服务实际上是代替父服务注入的

我没有尝试重新编写代码,因为错误非常罕见,代码本身也完全按照预期运行。我读过一些关于其他类型的注射的文章,比如“UseExisting”,但它似乎并没有立即起到作用

主要组成部分:

export class MotherComponent implements OnInit {
  @Input() data: Data[];

  constructor(
    public fb: FormBuilder,
    public service: MotherService,
    ...
  ) { }

  public getData() {
    this.service
      .getData()
      .pipe(take(1))
      .subscribe(data => {
        this.data = data;
        ...
      });
  }
...
}
@Component({
  ...
  providers: [
    { provide: MotherService, useClass: ChildService }
  ]
})
export class ChildComponent extends MotherComponent {
  public data2: Data2[];

   public getData() {
    super.getData();

    let data2: Data2[];
    this.service
      .getData2()
      .pipe(take(1))
      .subscribe(
        data2 => {
          this.data2 = data2;
      );
  }
...
}
子组件:

export class MotherComponent implements OnInit {
  @Input() data: Data[];

  constructor(
    public fb: FormBuilder,
    public service: MotherService,
    ...
  ) { }

  public getData() {
    this.service
      .getData()
      .pipe(take(1))
      .subscribe(data => {
        this.data = data;
        ...
      });
  }
...
}
@Component({
  ...
  providers: [
    { provide: MotherService, useClass: ChildService }
  ]
})
export class ChildComponent extends MotherComponent {
  public data2: Data2[];

   public getData() {
    super.getData();

    let data2: Data2[];
    this.service
      .getData2()
      .pipe(take(1))
      .subscribe(
        data2 => {
          this.data2 = data2;
      );
  }
...
}
摘要服务:

@Injectable()
export abstract class MotherService {
  constructor(public httpClient: HttpClientService) { }

  getData() {
    return new Observable<any>();
  }
}

我想消除终端和VS代码中的错误,方法是让Angular认识到被调用的方法实际上属于子服务,而不是父服务(也许是通过对它们进行一些奇怪的声明?但我不知道如何这样做)。

您提供了错误的类。如果您的组件需要
ChildService
,那么您应该提供
ChildService
,而不是
MotherService
。其他所有内容都是TypeScript错误消息,因为您忽略了这些类型。当我尝试自己提供ChildService时,我得到一个注入错误(StaticInjectorError(AppModule)[MotherComponent->MotherService]:StaticInjectorError(Platform:core)[MotherComponent->MotherService]:NullInjectorError:没有MotherService的提供程序!)。我相信子组件需要提供MotherService,因为它扩展了母组件(一开始我很难弄清楚)。从
MotherService
中删除
@Injectable()
。从中删除@Injectable()会使它无法注入服务(错误:无法解析ChildService:(?)的所有参数)。