我可以使用 nestjs 注入接口而不是 类 吗?

Can I use nestjs inject with interfaces instead of classes?

我想使用这样的东西:

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]

但是收到 Nest can't resolve dependencies of the

您可以使用@Inject('ICats')但是您必须向 DI 容器注册该注入令牌。为此,您可以像这样使用 custom provider

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

接口本身是不够的,因为没有关于它们的元数据,就像 类 一样。没有这些元数据,Nest 将不知道要注入什么,这就是为什么我们必须使用手册 @Inject()