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

lal*_*ana 2 dependency-injection typescript nestjs

我想用这样的东西:

猫接口.ts

export interface ICats {
  meow(): void
}
Run Code Online (Sandbox Code Playgroud)

猫服务.ts

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

  meow(): void {
    return;
  }
}
Run Code Online (Sandbox Code Playgroud)

猫模块.ts

@Module({
  providers: [CatsService]
  exports: [CatsService]
})
export class CatsModule {}
Run Code Online (Sandbox Code Playgroud)

动物.service.ts

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

  test(): void {
    return this.cats.meow();
  }
}
Run Code Online (Sandbox Code Playgroud)

动物模块.ts

@Module({
  imports: [CatsModule],
  providers: [AnimalsService],
  exports: [AnimalsService]
Run Code Online (Sandbox Code Playgroud)

但收到 Nest can't resolve dependencies of the

Jay*_*iel 6

您可以使用@Inject('ICats')您必须向 DI 容器注册该注入令牌。为此,您可以使用自定义提供程序,如下所示:

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

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