私のコンストラクタにはオプションのパラメータがあり、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を使用してこのクラス(モデル)を作成できないため、このオブジェクトをインスタンス化するクラスから手動でサービスを渡します。
登録されているプロバイダーがある場合にのみ挿入されるコンストラクターパラメーターの前に @Optional()
デコレーターを追加するだけです。
constructor(public name:string, @Optional() public age:number)
あなたがしようとしていることを正しく理解しているなら、サービス工場が必要です。こちらをご覧ください: 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]}]