Home » Javascript » Angular 6 Services and Class Inheritance

Angular 6 Services and Class Inheritance

Posted by: admin October 29, 2018 Leave a comment

Questions:

Angular 6 now has injectable providers which is the new recommended way of injecting services, and it works really well except I’m having a problem when using a service which extends another service. So as an example, suppose I have

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

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

The problem is that no matter what I ask for in a component, the parent class is always injected.

So if you ask for

constructor(private childAppService: ChildAppService) { ... }

you will still be provided an instance of ParentAppService, which isn’t expected.

A very simple workaround would be to just register the providers in your module the old fashioned way, and this works:

@NgModule({
 providers: [AppService, ChildAppService]
})

But that’s basically the old way of doing things, and doesn’t have the benefits of better tree-shaking and cleaner testing like the new providedIn registration process.

So my question is, what’s the right way to do this? Is there a better way to register a provider so I can get the desired behavior (maybe specifying a provider token somehow?).

I’ve setup a super simple stackblitz example to show what’s going on.

https://stackblitz.com/edit/angular-lacyab?file=src%2Fapp%2Fapp.component.ts

You’ll notice it says “Hello I AM APP SERVICE!” even though the component asked to be provided the child service. If in the app module we register the providers the old way (see the commented out code), all of a sudden the proper provider gets injected.

Thanks for your help!

Answers: