Dependency injection 具有可选参数的DI构造函数

Dependency injection 具有可选参数的DI构造函数,dependency-injection,typescript,angular,Dependency Injection,Typescript,Angular,我的构造函数有可选参数,它们似乎干扰了执行DI的主要方式 constructor(public name:string, public age?:number, private _service:Service); Typescript不喜欢在可选参数后面加一个非可选参数,这是可以理解的,而且当未设置可选参数时,服务不会被注入。我该如何解决这个问题?我不能把它放在构造函数的其他地方,因为我需要手动设置服务 有类似于现场注射的东西吗 @Inject() private _service:Serv

我的构造函数有可选参数,它们似乎干扰了执行DI的主要方式

constructor(public name:string, public age?:number, private _service:Service);
Typescript不喜欢在可选参数后面加一个非可选参数,这是可以理解的,而且当未设置可选参数时,服务不会被注入。我该如何解决这个问题?我不能把它放在构造函数的其他地方,因为我需要手动设置服务

有类似于现场注射的东西吗

@Inject() private _service:Service;

constructor(public name:string, public age?:number);
我应该用默认值替换可选参数吗?还有其他建议吗

编辑: 正如下面所讨论的,我尝试将服务注入到一个不是由Angular的DI创建的对象中。这不管用。由于我不能使用DI创建这个类(模型),我现在从实例化这个对象的类手动传递服务

只需在构造函数参数之前添加decorator,只有在注册了提供程序时才应注入该参数

从'@angular/core'导入{Optional};
构造函数(public name:string,@Optional()public age:number)

如果我正确理解您的意图,您需要一家服务工厂。请看这里:

基本上

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]}]

我可能遗漏了什么,但“年龄”不是我想要注射的东西。我使用构造函数创建新对象,比如
newperson(“Mike”,32)
服务
应独立于年龄设置与否进行注入。或者我只需要用@optional()注释每个可选项(TS=?)?我不确定我是否完全理解您的问题。对于
新人(“Mike”,32)
根本不涉及依赖注入。仅当实例由DI本身创建时,才涉及DI。例如,组件及其依赖项由DI实例化。你能澄清一下吗?“只有当实例是由DI自己创建的时候,DI才会参与进来。”我想这是我的“问题”或者我不明白的事情。我使用构造函数手动创建对象,设置名称和年龄。我认为DI会向注册的提供者注入其他参数。我猜这是行不通的。
Person
类是不可注入的,因此我不选择这个。Person只是一个带有save函数的模型类,它需要一个服务——我很想注入这个服务。我想我需要重新构造类或以另一种方式获得服务。如果将
私有服务:服务
注入到要创建
新人的组件()
,那么您只需执行
新人(“Mike”,32岁,这个.\u服务)
(仍然不确定这是否是您要将服务传递到的位置)。