Я бы хотел, чтобы свойство httpStatus присутствовало бы во всех реализациях абстрактного класса BasePageServ, но при этом не являлось бы его собственным свойством.
Сейчас я выделил интерфейс, но приходится совмещать extends и implements:
abstract class BasePageServ {
constructor(public p: any) {};
render() { return this.p };
}
interface IConcretePageServ extends BasePageServ{
httpStatus: number;
}
class MainPageServ extends BasePageServ implements IConcretePageServ{
httpStatus: number;
constructor(public p: string) {
super(p);
this.httpStatus = 200;
}
}
Интерфейс тоже наследуется от абстрактного класса, чтобы иметь возможность типизировать параметры функций, например:
function fn(page: IConcretePageServ) {
return page.httpStatus
}
Я думаю о том, чтобы шаблонизировать подобные свойства в базовом классе и при необходимости перезаписывать их в дочерних:
class MainPageServ extends BasePageServ{
override httpStatus: number;
constructor(public p: string) {
super(p);
this.httpStatus = 200;
}
}
Это позволило бы отказаться от интерфейса, хотя типизация параметров выглядела бы не так очевидно, ведь на самом деле page не является инстансом базового класса, а только наследуется от него:
function fn(page: BasePageServ) {
return page.httpStatus
}
Какой из этих двух шаблонов лучше использовать? И, может быть, есть более удачный вариант?