Javascript Angular 6服务和类继承

Javascript Angular 6服务和类继承,javascript,angular,Javascript,Angular,Angular 6现在有一个新的推荐注入服务的方法,它工作得非常好,只是我在使用扩展另一个服务的服务时遇到了问题。举个例子,假设我有 @Injectable({ providedIn: 'root' }) export class ParentAppService { ... } @Injectable({ providedIn: 'root' }) export class ChildAppService extends ParentAppService { ... } 问题是,无

Angular 6现在有一个新的推荐注入服务的方法,它工作得非常好,只是我在使用扩展另一个服务的服务时遇到了问题。举个例子,假设我有

@Injectable({
  providedIn: 'root'
})
export class ParentAppService { ... }

@Injectable({
  providedIn: 'root'
})
export class ChildAppService extends ParentAppService { ... }
问题是,无论我在组件中要求什么,父类总是被注入

所以如果你要求

constructor(private childAppService: ChildAppService) { ... }
您仍将获得一个ParentAppService实例,这是不期望的

一个非常简单的解决方法是以老式的方式在模块中注册提供者,这是可行的:

@NgModule({
 providers: [AppService, ChildAppService]
})
但这基本上是老办法,没有更好的摇树和更干净的测试的好处,就像注册过程中提供的新方法一样

所以我的问题是,正确的方法是什么?是否有更好的方法来注册提供者,以便获得所需的行为(可能以某种方式指定提供者令牌?)

我已经设置了一个超级简单的stackblitz示例来说明发生了什么

您会注意到它会说“你好,我是应用程序服务!”即使组件要求提供子服务。如果在应用程序模块中,我们以旧的方式注册提供者(请参阅注释掉的代码),那么会突然注入正确的提供者


谢谢你的帮助

更新:

已经有一个拉取请求了

原始版本

问题:新的angular treeshakable服务似乎不尊重继承:

第一个角度定义(1
ngInjectableDef
函数上的属性。然后从
AppService
继承
ChilAppService
,以便子类包含父类的所有属性。最后,当angular尝试在
ChildAppService
上定义(2
ngInjectableDef
属性时,它无法定义,因为由于javascript原型继承,它已经存在(3

为了修复它,你可以

1) 通过在子服务上定义未定义的
ngInjectableDef
属性来解决此问题,这样它就不会从父类属性中读取已填充的内容,并且angular将能够在子类上定义
ngInjectableDef

@可注入({
providedIn:'根'
})
导出类ChildAppService扩展了AppService{
静态ngInjectableDef=未定义;
构造函数(){
超级();
this.name='子服务';
}
}

2) 或在github中报告问题


3) 或者按照评论中的建议使用组合而不是继承。

使用组合而不是继承?
@Injectable({
  providedIn: 'root'
})
export class ChildAppService extends AppService {
  static ngInjectableDef = undefined;
  constructor() {
    super();
    this.name = 'CHILD SERVICE';
  }
}