web-dev-qa-db-ja.com

オプションのパラメーターを持つDIコンストラクター

私のコンストラクタにはオプションのパラメータがあり、DIを行う主な方法を台無しにしているようです。

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

TypeScriptは、オプションのパラメーターの後ろに非オプションのパラメーターを配置することを理解できません。さらに、オプションのパラメーターが設定されていない場合、サービスは挿入されません。どうすれば解決できますか?サービスを手動で設定することが期待されるため、コンストラクタのどこかにそれを置くことはできません。

フィールドインジェクションのようなものはありますか?

@Inject() private _service:Service;

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

オプションのパラメーターをデフォルト値に置き換える必要がありますか?他の提案はありますか?

EDIT:以下で説明するように、AngularのDIで作成されていないオブジェクトにサービスを挿入しようとしました。これは機能しません。 DIを使用してこのクラス(モデル)を作成できないため、このオブジェクトをインスタンス化するクラスから手動でサービスを渡します。

15
KenavR

登録されているプロバイダーがある場合にのみ挿入されるコンストラクターパラメーターの前に @Optional() デコレーターを追加するだけです。

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

あなたがしようとしていることを正しく理解しているなら、サービス工場が必要です。こちらをご覧ください: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

基本的に、

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

その後

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

そして、次のようなサービスを提供する必要があります。

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}]
3
Cosmin Popescu