DI构造函数,带有可选参数

Ken*_*avR 16 dependency-injection typescript angular

我的构造函数具有可选参数,它们似乎混淆了主要的DI方式.

constructor(public name:string, public age?:number, private _service:Service);
Run Code Online (Sandbox Code Playgroud)

打字稿可以理解地不喜欢我在可选参数后面放置一个非可选参数,此外,当未设置可选参数时,不会注入服务.我该如何解决?我不能把它放在构造函数中的其他地方,因为我希望手动设置服务.

有没有像野外注射?

@Inject() private _service:Service;

constructor(public name:string, public age?:number);
Run Code Online (Sandbox Code Playgroud)

我应该用默认值替换可选参数吗?还有其他建议吗?

编辑: 如下所述,我试图将一个服务注入一个不是由Angular的DI创建的对象.这不起作用.由于我无法使用DI创建此类(模型),因此我现在从实例化此对象的类中手动传递服务.

Gün*_*uer 23

只需@Optional()在构造函数参数之前添加装饰器,只有在注册了提供程序时才应该注入该参数.

constructor(public name:string, @Optional() public age:number)
Run Code Online (Sandbox Code Playgroud)

  • 不确定我完全理解你的问题.使用`new Person("Mike",32)`根本不涉及依赖注入.DI仅在DI本身创建实例时才会涉及.例如,组件及其依赖关系由DI实例化.你能澄清一下吗? (2认同)

Cos*_*scu 5

如果我正确理解你想要做什么,你需要一个服务工厂。请参阅此处:https ://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

基本上,

class MyClass {
    constructor(public name:string, private _service:Service, public age?:number){}
}
Run Code Online (Sandbox Code Playgroud)

进而

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

然后你应该像这样提供你的服务:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}]
Run Code Online (Sandbox Code Playgroud)