You need to enable JavaScript to run this app. Angular应用中子类调用super()时如何向父类构造器注入共享依赖
优惠活动
大模型
产品
解决方案
定价
更多

Angular应用中子类调用super()时如何向父类构造器注入共享依赖

Angular类继承场景下依赖注入重复引用解决方案

方案1:移除子类注入参数的访问修饰符(最简单)

父类代码保持不变:

export abstract class ListPageComponent {
  // ...
  constructor(protected ngZone: NgZone) {}
  // ...
}

子类构造函数的ngZone参数不要加protected/public/private等访问修饰符,仅作为普通参数传递给父类即可:

export class UserListPageComponent extends ListPageComponent {
  // ...
  constructor(ngZone: NgZone) {
    super(ngZone);
  }
  // 子类中可直接通过this.ngZone访问父类声明的成员,不会生成额外的实例引用
  // ...
}

方案2:父类通过Injector自行获取依赖(适合父类依赖较多的场景)

如果不想每次子类都要手动传递父类的所有依赖,可以让父类直接注入Injector自行完成依赖查找:

import { Injector, NgZone } from '@angular/core';

export abstract class ListPageComponent {
  protected ngZone: NgZone;
  // ...
  constructor(injector: Injector) {
    this.ngZone = injector.get(NgZone);
  }
  // ...
}

子类只需注入Injector传递给父类即可,不需要再单独处理NgZone的注入逻辑:

export class UserListPageComponent extends ListPageComponent {
  // ...
  constructor(injector: Injector) {
    super(injector);
  }
  // 直接访问this.ngZone即可,全程仅父类持有一份引用
  // ...
}

问题根因说明

你之前的写法中子类构造函数的ngZone参数添加了protected修饰符,TypeScript会自动将该参数声明为子类的实例属性,和父类声明的ngZone属性重复,才会出现两份引用的问题。去掉访问修饰符后该参数仅作为普通入参传递,不会生成额外的类属性。

内容的提问来源于stack exchange,提问作者gib65

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:24:01