@romaro

Можно ли здесь отказаться от интерфейса?

Я бы хотел, чтобы свойство 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
}


Какой из этих двух шаблонов лучше использовать? И, может быть, есть более удачный вариант?
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы