Angular 12升级至13后依赖注入报错:构造函数依赖无效
Angular 12升级至13后DI报错:构造函数依赖项无效的解决方案
问题根源
Angular 13对依赖注入(DI)的参数校验逻辑进行了强化,当服务的构造函数包含未被DI系统识别的可选参数时,会触发该报错。你的JhiConfigService构造函数中的moduleConfig?: JhiModuleConfig属于自定义类型参数,既没有用@Optional()标记可选性,也没有通过注入令牌告知Angular如何解析它,导致DI判定该依赖无效。
具体解决方案
1. 为自定义参数添加注入令牌与装饰器
首先创建一个注入令牌,用于标识JhiModuleConfig类型的配置:
import { InjectionToken } from '@angular/core'; import { JhiModuleConfig } from './你的路径'; export const JHI_MODULE_CONFIG = new InjectionToken<JhiModuleConfig>('JhiModuleConfig');
然后修改JhiConfigService的构造函数,用@Optional()和@Inject()装饰器标记参数:
@Injectable() export class JhiConfigService { CONFIG_OPTIONS: JhiModuleConfig; constructor( @Optional() @Inject(JHI_MODULE_CONFIG) moduleConfig?: JhiModuleConfig ) { this.CONFIG_OPTIONS = { ...new JhiModuleConfig(), ...moduleConfig }; } getConfig(): JhiModuleConfig { return this.CONFIG_OPTIONS; } }
2. 在模块中配置提供者(可选)
如果需要给JhiConfigService传递默认配置,在注册该服务的模块的providers数组中添加令牌的提供者:
import { JHI_MODULE_CONFIG } from './你的路径'; @NgModule({ // ...其他配置 providers: [ JhiConfigService, { provide: JHI_MODULE_CONFIG, useValue: { // 这里填写你的默认配置,比如xxx: 'xxx' } } ] }) export class YourModule {}
如果不需要默认配置,仅保留JhiConfigService即可,因为参数已标记为@Optional()。
3. 批量排查其他涉事组件/服务
由于大量指令、管道都出现同类报错,需统一检查所有构造函数:
- 确保所有依赖均为Angular可注入类型(服务、
ElementRef等内置DI对象) - 对于原始类型(string/number)或自定义类型的参数,必须通过注入令牌+
@Inject()传递,可选参数额外添加@Optional() - 避免在构造函数中直接使用未标记的自定义类型参数
为什么之前的方法无效?
此次问题并非providedIn: 'root'的配置问题,而是Angular 13新增的DI参数校验规则导致——此前版本对未标记的可选自定义参数兼容性更强,13开始强制要求明确标记依赖的注入方式。
内容的提问来源于stack exchange,提问作者D.Zet
相关产品推荐
相关产品推荐

