typescript - Môžem použiť nestjs inject s rozhraniami namiesto tried?


Chcem použiť niečo takéto:

cats.interface.ts

export interface ICats {
  meow(): void
}

cats.service.ts

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

  meow(): void {
    return;
  }
}

cats.module.ts

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

animals.service.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]

Ale dostanete Nest nemôže vyriešiť závislosti

Odpoveď č. 1

Môžete použiť @Inject('ICats'), ale musíte zaregistrovať tento injekčný token v DI kontejnere. Na to môžete použiť vlastného poskytovateľa takto:

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

Rozhrania samy o sebe nestačia, pretože neexistujú žiadne metaúdaje o nich, ako je tomu v prípade tried. Bez týchto metaúdajov Nest nebude vedieť, čo má injektovať, preto musíme použiť manuálne @Inject()