Angular共享模块forRoot传参类型错误,如何修正类型检查?
解决TypeScript类型不匹配问题
错误原因很明确:你传入的是MyClientService类的构造函数,但forRoot方法的参数类型要求是SharedAbstractService的实例,两者类型不匹配,导致TS报错。
修改shared.module.ts的类型检查和提供者配置即可解决:
export class SharedModule { // 将svc的类型从SharedAbstractService改为typeof SharedAbstractService,允许传入类构造函数 public static forRoot(config: {svc: typeof SharedAbstractService}): ModuleWithProviders<SharedModule> { return { ngModule: SharedModule, providers: [ { provide: 'configurationService', // 用useClass指定要实例化的服务类,替代原来的useExisting useClass: config.svc } ] }; } }
补充说明:
typeof SharedAbstractService表示抽象类的构造函数类型,MyClientService作为它的子类,其构造函数类型与该类型兼容。- 如果需要保留
useExisting,需先将传入的服务类注册为提供者,再通过useExisting引用:
export class SharedModule { public static forRoot(config: {svc: typeof SharedAbstractService}): ModuleWithProviders<SharedModule> { return { ngModule: SharedModule, providers: [ config.svc, // 先注册服务类 { provide: 'configurationService', useExisting: config.svc } ] }; } }
另外注意你的客户端服务定义存在语法错误,需补充class关键字:
@Injectable() export class MyClientService extends SharedAbstractService{ // 此处添加class name = 'Samuel'; //..... 其他代码 }
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

