DI constructor with optional parameters

24,575

Solution 1

Just add the @Optional() decorator before the constructor parameter that should only be injected if there was a provider registered.

import { Optional } from '@angular/core';    

constructor(public name:string, @Optional() public age:number)

Solution 2

If I understand correctly what you are trying to do, you need a service factory. See here: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

Basically,

class MyClass {
    constructor(public name:string, private _service:Service, public age?:number){}
}

And then

let myFactory = (_service: Service) => {
  return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service);
};

And then you should provide your service like this:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}]
Share:
24,575
KenavR
Author by

KenavR

Updated on January 21, 2021

Comments

  • KenavR
    KenavR over 3 years

    My constructor has optional parameters and they seem to mess with the predominant way of doing DI.

    constructor(public name:string, public age?:number, private _service:Service);
    

    Typescript understandably doesn't like that I put a non optional parameter behind an optional one, furthermore the service doesn't get injected when the optional parameter isn't set. How do I solve that? I can't put it somewhere else in the constructor since I would be expected setting the service manually.

    Is there something like field injection?

    @Inject() private _service:Service;
    
    constructor(public name:string, public age?:number);
    

    Should I replace the optional parameters with default values? Any other suggestions?

    EDIT: As discussed below, I tried to inject a service into an object that isn't created by Angular's DI. This doesn't work. Since I can't create this class (model) using DI I now pass the service manually from the class that instantiates this objects.