Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.12.2019, 19:59
Аспирант
Отправить личное сообщение для sniffysko Посмотреть профиль Найти все сообщения от sniffysko
 
Регистрация: 20.10.2009
Сообщений: 79

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

Как решить эту ошибку?
Есть конечно вариант вместо абстрактных функций в базовом классе наклепать функции, которые будут вызывать исключения и вынуждать разработчика перекрывать эти функции, но как-то не симпатично мне это решение.
Ответить с цитированием
  #2 (permalink)  
Старый 29.12.2019, 06:24
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,204

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

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

Убрал директивы и сборка прошла нормально. Спасибо за подсказку.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление custom класса как item класса tab. Unrecognized alias: widget. Postgeograph ExtJS 6 13.12.2018 10:56
Наследование класса WishMaster Общие вопросы Javascript 10 14.10.2015 21:41
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 15:17
Свойства/методы класса TicTac Общие вопросы Javascript 5 03.07.2011 13:53