You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:00:02