Как использовать литеральный тип в качестве параметра конструктора службы в NestJS - PullRequest
0 голосов
/ 30 марта 2020

У меня есть литеральный тип в качестве параметра конструктора в моем сервисе:

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

1 Ответ

1 голос
/ 31 марта 2020

С помощью Nest JS вам необходимо предоставить аргументы конструктора через providers. Nest обычно использует classes, чтобы знать, с каким токеном инъекции работать, поскольку классы сохраняются как в Typescript, так и в JavaScript. Однако вы можете использовать декоратор @Inject() со своим собственным токеном инъекции и пользовательским значением, чтобы гарантировать, что Nest внедрит значение правильно. Это будет выглядеть примерно так:

@Module({
  providers: [
    MyService,
    {
      provide: 'MyToken', // this can be a symbol or a string
      useValue: 'val2',
    }
    AppService,
  ],
})
export class AppModule {}
export type MyType = 'val1' | 'val2';
@Injectable()
export class MyService {


  constructor(
    private appService: AppService,
    // this token MUST match exactly to the one in the `provide` property of the custom provider
    @Inject('MyToken') private myType: MyType
  ) {}
}

Если вы хотите добавить другие зависимости, просто убедитесь, что они доступны для модуля.

Другой вариант - пометить myType как @Optional(), что позволит Nest обойти инъекцию, если она неразрешима, тогда вы можете легко использовать значение по умолчанию, как раньше

...