Я создаю некоторые компоненты динамически, используя фабрику модулей Angular:
const moduleRef = moduleFactory.create(this.injector);
const compFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(moduleRef.instance.widgetComponent);
const componentRef = container.createComponent(compFactory);
У меня есть абстрактный класс, который определяет создаваемый виджет, и некоторые дополнительные методы, которые я здесь удалил, где T - это компонент Angular:
export abstract class WebPartBaseModule<T extends ComponentWidgetBase> {
abstract widgetComponent;
}
Затем в модулях производных классов я явно устанавливаю нужный мне компонент:
export class HealthCheckModule extends WebPartBaseModule<HealthCheckComponent> {
widgetComponent = HealthCheckComponent;
}
Это работает хорошо, но мне интересно, есть ли способ вывести / присвоить тип в базовом классе из T. Это то, что мне нужно, с тех пор мне не нужно было бы назначать widgetComponent в каждом производном классе, но он явно не работает:
export abstract class WebPartBaseModule<T extends ComponentWidgetBase> {
widgetComponent = T;
}
Он не используется в классе напрямую, его вызывает: moduleRef.componentFactoryResolver.resolveComponentFactory (m oduleRef.instance.wi dgetComponent);
Я поясню вышесказанное, хотя widgetComponent не используется напрямую, T используется в методе инициализации: public initComponent (component: T, path: string): void {// инициализация, общая для всех компонентов, производных от ComponentWidgetBase}
В классе экспорта HealthCheckModule расширяет WebPartBaseModule <HealthCheckComponent> {widgetComponent = HealthCheckComponent; } откуда берется HealthCheckComponent?
Это угловой компонент, определенный в отдельном классе: import {HealthCheckComponent} из './health-check.component';





Можете ли вы показать, как вы используете
widgetComponentв абстрактном классе? Может, можно просто использоватьTнапрямую?