DI constructor with optional parameters
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]}]
KenavR
Updated on January 21, 2021Comments
-
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.