AngularJS迁移至Angular遇NG0202错误:构造器与DI不兼容
解决Angular NG0202依赖注入错误(UpgradeModule相关)
解决步骤
- 在AppModule构造函数的UpgradeModule参数上添加
@Inject显式声明依赖:import { Inject, DoBootstrap, NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { UpgradeModule } from '@angular/upgrade/static'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; @NgModule({ imports: [ BrowserModule, UpgradeModule ], }) export class AppModule implements DoBootstrap { constructor(@Inject(UpgradeModule) private upgrade: UpgradeModule) { } ngDoBootstrap() { this.upgrade.bootstrap(document.body, ['CoreApplication'], { strictDi: true }); } } platformBrowserDynamic().bootstrapModule(AppModule); - 检查并确保
tsconfig.json中compilerOptions.emitDecoratorMetadata设置为true(JIT编译模式下必须开启):{ "compilerOptions": { "emitDecoratorMetadata": true, // 其他配置... } } - 验证importmap中
@angular/upgrade/static的映射路径是否正确,确保指向对应的ES模块文件。
问题原因
你遇到的NG0202错误,本质是Angular依赖注入系统无法识别AppModule构造函数中第一个参数(UpgradeModule)的有效依赖类型。从你提供的AppModule_Factory函数代码可以看到,编译器生成了jit___invalidFactoryDep_1(0),说明它无法自动解析UpgradeModule的DI元数据。
结合你调试发现的provider.deps: []空数组,进一步确认DI系统没有正确识别构造函数的依赖项。这种情况通常出现在JIT编译模式下,当类型元数据丢失、模块路径解析异常(比如使用importmap时的映射问题)时,Angular无法自动推断依赖类型。
显式添加@Inject装饰器可以强制告诉DI系统该参数的依赖类型,绕过自动类型识别的缺陷;开启emitDecoratorMetadata则确保编译器能生成必要的元数据供DI系统使用。
内容的提问来源于stack exchange,提问作者Matteo Padovan
相关产品推荐
相关产品推荐

