Ошибка регистрации абстрактного класса в модуле
Здравствуйте. Имеется абстрактный класс для реализации базовой функциональности компонент. И вот настал час выполнить продуктовую сборку и приключилась ошибка. Класс зерегистрирован в CommonAppModule, который несет в себе объявления общеупотребимых компонент проекта:
@NgModule({ exports: [ CommonComponentsClass ... ], declarations: [ CommonComponentsClass ... ] }) export class CommonAppModule{} А вот сам класс. Ничего хитрого в общем: @Component({ selector: '', template: '' }) export abstract class CommonComponentsClass<T> implements OnInit, OnDestroy { abstract initState(): void; abstract formSubmit(): void; ... } Со стороны среды разработки сразу получю ошибку: ERROR in src/app/share/common.app.module.ts(64,3): error TS2322: Type 'typeof CommonComponentsClass' is not assignable to type 'any[] | Type<any>'. Type 'typeof CommonComponentsClass' is not assignable to type 'Type<any>'. Cannot assign an abstract constructor type to a non-abstract constructor type. Как решить эту ошибку? Есть конечно вариант вместо абстрактных функций в базовом классе наклепать функции, которые будут вызывать исключения и вынуждать разработчика перекрывать эти функции, но как-то не симпатично мне это решение. :( |
Ээ, вообще говоря так нельзя делать. Потому что в ангуляре где-то под капотом вызывается new CommonComponentsClass, а создавать инстансы абстрактного класса нельзя. Вообще его не надо пихать в declarations ангуляр модуля. Нужно просто для компонентов которые должны реализовывать его интерфейс, делать обычный es6 импорт и
@Component({ selector: 'my-cmp', template: 'some template' }) export class MyCmp extends CommonComponentsClass { ... } |
Вашу правоту не оспариваю. Он он первый начал. :о) В процессе сборки сборщик ругался так:
ERROR in Cannot determine the module for class CommonComponentsClass in C:/PROJECTS/adm/src/app/share/classes/Common.Components.class.ts! Add CommonComponentsClass to the NgModule... Я так понял, что этот кусок кода вызывает инициализацию компонента, а как следствие требует разместить его в модуле: @Component({ selector: '', template: '' }) Убрал директивы и сборка прошла нормально. Спасибо за подсказку. |
Часовой пояс GMT +3, время: 07:14. |