@ikutin666

Проблемы с типами при наследовании от абстрактного класса или при импликации от интерфейса?

Всем привет!!!
использую typescript typescript 3.1.6

почему это является корректным?

abstract class BaseUserInfo {
  abstract addChangeListener(callback: (a: any) => void): void;
  abstract removeChangeListener(callback: (a: any) => void): void;
  abstract getState(): void;
  abstract setState(newUserInfo: UserInfoModel): void;
}
export class UserInfo extends BaseUserInfo {
//...
override getState = (): UserInfoModel => {
    return this.state; // type UserInfoModel
  };
}

почему typescript не ругается ведь getState в дочернем и в абстрактном классе имеет разные сигнатуры
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Ну потому что extend - это "расширение", и главное совместимость, м?

В данном случае любой UserInfo обратно совместим с BaseUserInfo, т.к. для BaseUserInfo.getState() возвращаемое значение имеет тип void (не путать с undefined), который никак не может быть использован (сам ts не даст).
abstract class BaseUserInfo {
  abstract getState(): void;
}

class UserInfo extends BaseUserInfo { 
  override getState = (): number => 1;
}

function useInfo(info: BaseUserInfo) {
  // An expression of type 'void' cannot be tested for truthiness.(1345)
  if (info.getState()) { // не получится так сделать и всё сломать
    console.log('never')
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы