Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Ошибка регистрации абстрактного класса в модуле (https://javascript.ru/forum/angular/79174-oshibka-registracii-abstraktnogo-klassa-v-module.html)

sniffysko 28.12.2019 20:59

Ошибка регистрации абстрактного класса в модуле
 
Здравствуйте. Имеется абстрактный класс для реализации базовой функциональности компонент. И вот настал час выполнить продуктовую сборку и приключилась ошибка. Класс зерегистрирован в 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.

Как решить эту ошибку?
Есть конечно вариант вместо абстрактных функций в базовом классе наклепать функции, которые будут вызывать исключения и вынуждать разработчика перекрывать эти функции, но как-то не симпатично мне это решение. :(

destus 29.12.2019 07:24

Ээ, вообще говоря так нельзя делать. Потому что в ангуляре где-то под капотом вызывается new CommonComponentsClass, а создавать инстансы абстрактного класса нельзя. Вообще его не надо пихать в declarations ангуляр модуля. Нужно просто для компонентов которые должны реализовывать его интерфейс, делать обычный es6 импорт и
@Component({
	selector: 'my-cmp',
	template: 'some template'
})
export class MyCmp extends CommonComponentsClass {
	...
}

sniffysko 29.12.2019 12:44

Вашу правоту не оспариваю. Он он первый начал. :о) В процессе сборки сборщик ругался так:
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.