Angular DI使用工厂提供者动态实例化时报错Type<MyClass>不是构造函数
问题根因
- 你当前的
myClassProvider配置是让Angular在注入MyClass时,直接执行myClassFactory函数返回实例,而你预期注入的是可以接收动态类类型参数的工厂函数本身,两者逻辑完全不符。 - 你的
myClassFactory定义的第一个入参myClassType没有在deps数组中声明,Angular DI容器启动时执行工厂函数时没有传入该参数,所以运行时myClassType是undefined,自然报错不是构造函数。
修复方案
第一步:调整工厂逻辑,返回高阶函数
修改MyClass.ts中的工厂函数,让Angular执行工厂注入时,返回你需要的、可接收动态类类型的构造函数,将注入的HttpClient通过闭包保留:
import { Type } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable() export abstract class MyClass { constructor(http: HttpClient) {} } // 工厂函数仅接收Angular容器可注入的HttpClient作为参数 export function myClassFactory(http: HttpClient): (myClassType: Type<MyClass>) => MyClass { // 返回你需要的动态构造函数 return (myClassType: Type<MyClass>) => { return new myClassType(http); }; }; export let myClassProvider = { provide: MyClass, useFactory: myClassFactory, deps: [HttpClient] };
第二步:保持原有组件逻辑不变
你的组件注入代码、ngOnInit中的调用逻辑都不需要修改,调整后就可以正常运行:
// 构造函数注入逻辑不变 constructor(@Inject(MyClass) private _myClassFactory: (myClassType: Type<MyClass>) => MyClass) {} // ngOnInit调用逻辑不变 ngOnInit() { // 拿到HTTP请求返回的类类型后调用即可 let myClassInstance: MyClass = this._myClassFactory(myClassType); }
内容的提问来源于stack exchange,提问作者Payerl
相关产品推荐
相关产品推荐

