Dependency injection 如何在NestJS中将文本类型用作服务构造函数参数

Dependency injection 如何在NestJS中将文本类型用作服务构造函数参数,dependency-injection,service,nestjs,Dependency Injection,Service,Nestjs,我的服务上有一个文本类型作为构造函数参数: export type MyType = 'val1' | 'val2'; @Injectable() export class MyService { myType: MyType; constructor(private appService: AppService, private myType: MyType = 'val2') { this.myType = myType; } } 我在构建时间上有一个错误 Nest

我的服务上有一个文本类型作为构造函数参数:

export type MyType = 'val1' | 'val2';

@Injectable()
export class MyService {
  myType: MyType;
  constructor(private appService: AppService, private myType: MyType = 'val2') {
    this.myType = myType;
  }
}
我在构建时间上有一个错误

Nest can't resolve dependencies of the MyService (AppService, ?). Please make sure that the argument String at index [1] is available in the AppModule context.

Potential solutions:
- If String is a provider, is it part of the current AppModule?
- If String is exported from a separate @Module, is that module imported within AppModule?
  @Module({
    imports: [ /* the Module containing String */ ]
  })
你将如何解决这个问题

这是我的AppModule:

@Module({
  imports: [HttpModule],
  controllers: [AppController],
  providers: [AppService, MyService, HttpClient],
})
export class AppModule {}

使用NestJS,您需要通过提供程序提供构造函数参数。Nest通常使用类来知道使用什么注入令牌,因为类同时存在于Typescript和JavaScript中。但是,您可以将@InjectDecorator与您自己的注入令牌和自定义值一起使用,以确保Nest正确地注入值。这将看起来像这样:

@模块{ 供应商:[ 我的服务, { 提供:“MyToken”,//这可以是符号或字符串 useValue:'val2', } 应用服务, ], } 导出类AppModule{} 导出类型MyType='val1'|'val2'; @注射的 导出类MyService{ 建造师 专用appService:appService, //此令牌必须与自定义提供程序的“提供”属性中的令牌完全匹配 @注入'MyToken'私有myType:myType {} } 如果要添加其他依赖项,只需确保它们对模块可用


另一个选项是将myType标记为@Optional,这将允许Nest在无法解决注入时绕过注入,然后您可以像以前一样轻松地使用默认值

您是否为模块文件中的MyType提供了Nest要注入的内容?@JayMcDoniel刚刚用my AppModules更新了这个问题,您可以看到我的默认值private MyType:MyType='val2',可以在运行时被调用方覆盖。那么,您如何能够在运行时使用令牌覆盖该值呢?您计划如何在运行时调用MyService?您是打算让Nest处理它,还是打算自己创建实例?正如您所看到的,我在AppModule中提供MyService,所以我没有实例化manuallySo,您打算如何更改MyType的值?它会根据什么变化?使用useFactory而不是useValue是可能的,在这里你提供了一个函数来确定要提供的值,但我不能给出一个例子,如果不知道你打算如何决定应该提供什么值。是的,这是一个好问题,我想我可能会坚持使用“提供->价值”,但我想知道你会如何处理工厂,使用“提供->价值”和“工厂”有什么区别?