Export a symbol or a string along with your interface with the same name
export interface IService {
get(): Promise<string>
}
export const IService = Symbol("IService");
Now you can basically use IService
as both the interface and the dependency token
import { IService } from '../interfaces/service';
@Injectable()
export class ServiceImplementation implements IService { // Used as an interface
get(): Promise<string> {
return Promise.resolve(`Hello World`);
}
}
import { IService } from './interfaces/service';
import { ServiceImplementation} from './impl/service';
...
@Module({
imports: [],
controllers: [AppController],
providers: [{
provide: IService, // Used as a symbol
useClass: ServiceImplementation
}],
})
export class AppModule {}
import { IService } from '../interfaces/service';
@Controller()
export class AppController {
// Used both as interface and symbol
constructor(@Inject(IService) private readonly service: IService) {}
@Get()
index(): Promise<string> {
return this.service.get(); // returns Hello World
}
}