Angular DI 类类型:类型<MyClass> 不是构造函数

Angular DI classType: Type<MyClass> is not a constructor

所以我尝试在 ngOnInit 中使用 angular 依赖注入而不是构造函数。 我使用工厂提供程序找到了一些这样的例子,但事情不太奏效...

我得到了对

的引用
let myClassType: Type<MyClass> = ....

我可以使用

实例化自己的对象
let myClassInstance = new myClassType(http)

但是当我尝试设置 DI 以允许我使用 DI 时,我似乎失败了...... 出于某种原因,我在控制台中收到错误消息,指出 myClassFactory 函数 return 行上的 myClassType 不是构造函数,但由于可以使用相同的代码手动创建实例 elseware...

在我的组件上,我使用了这个构造函数:

constructor(@Inject(MyClass) private _myClassFactory: (myClassType: Type<MyClass>) => MyClass

我的理解是这种模式在组件 ngOnInit 中应该是可能的:

let myClassInstance: MyClass = this._myClassFactory(myClassType);

我的模型有这个:

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        HttpClientModule,
        AppRoutingModule
    ],
    providers: [
        myClassProvider
    ],
    bootstrap: [ AppComponent ]
})

我的 MyClass.ts 看起来像这样:

@Injectable()
export abstract class MyClass {
    constructor(http: HttpClient) {}
}

export function myClassFactory(myClassType: Type<MyClass>, http: HttpClient): MyClass {
    return new myClassType(http);
};

export let myClassProvider = { 
    provide: MyClass,
    useFactory: myClassFactory,
    deps: [HttpClient]
};

我想做这个不寻常的模式的原因是因为我希望能够使用从 http 调用传递的参数创建 MyClass 的实例,因此它们在创建组件时不可用。我尽可能地简化了示例。

气死我了...原来是犯了一个小错误,震惊..... 我通过替换它来让它工作:

export function myClassFactory(http: HttpClient, myClassType: Type<MyClass>): MyClass {
    return new myClassType(http);
};
export let myClassProvider: Provider = { 
    provide: MyClass,
    useFactory: myClassFactory,
    deps: [HttpClient]
};

有了这个:

export let myClassProvider: Provider = {
    provide: MyClass,
    useFactory: (http: HttpClient) => (myClassType: Type<MyClass>) => new myClassType(http),
    deps: [ HttpClient ]
};

起初我没有看出区别,但注意到第一次尝试将 useFactory 设置为一个带有两个参数的函数... 第二次尝试将 useFactory 设置为一个接受一个参数的函数,其中该函数 returns 一个也接受一个参数的新函数!

好像是因为js中参数是可选的(angular翻译成js)所以DI在启动时调用了provider函数,但是因为没有加参数所以只有http引用。这意味着变量 myClassType 是未定义的,当然这不会作为构造函数!