typescript - Pot folosi injectarea NestJS cu interfețe în loc de clase?


Vreau să folosesc ceva de genul acesta:

pisici.interfață.ts

export interface ICats {
  meow(): void
}

pisici.serviciu.ts

@Injectable()
export class CatsService implements ICats {
  constructor()

  meow(): void {
    return;
  }
}

pisici.modul.ts

@Module({
  providers: [CatsService]
  exports: [CatsService]
})
export class CatsModule {}

animale.serviciu.ts

@Injectable()
export class AnimalsService {
  constructor(@Inject('ICats') private readonly cats: ICats)

  test(): void {
    return this.cats.meow();
  }
}

animals.module.ts

@Module({
  imports: [CatsModule],
  providers: [AnimalsService],
  exports: [AnimalsService]

Dar primește Nest nu poate rezolva dependențele lui

Răspuns #1

Poți folosi @Inject('ICats'), dar trebuie să înregistrezi acel token de injecție în containerul DI. Pentru a face asta, poți folosi un furnizor personalizat astfel:

@Module({
  providers: [
    {
      provide: 'ICats',
      useClass: CatsService
    }
  ],
  exports: ['ICats'],
})
export class CatsModule {}

Interfețele de unele singure nu sunt suficiente, deoarece nu există metadate despre ele, așa cum există despre clase. Fără acele metadate, Nest nu va ști ce să injecteze, motiv pentru care trebuie să folosim manual @Inject()