Выбор ответа Middle Классы и интерфейсы обновлено

implements и типы параметров

Вопрос

Что скажет компилятор при strict: true?

interface Handler {
  handle(e: string): void;
}
class H implements Handler {
  handle(e) {
    console.log(e.toUpperCase());
  }
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ошибка: параметр e неявно имеет тип any. implements только проверяет класс на соответствие интерфейсу, а типы в класс не переносит.

Варианты ответа

  1. Ошибка: класс неправильно реализует интерфейс
  2. Всё компилируется: e имеет тип unknown
  3. Всё компилируется: e получает тип string из интерфейса
  4. Ошибка: параметр e неявно имеет тип anyправильный ответ

Разбор

implements только проверяет класс на соответствие интерфейсу, а типы в класс не переносит. Параметр e без аннотации получает неявный any, и noImplicitAny из strict даёт ошибку. Нужно написать handle(e: string).

Это частое заблуждение: кажется, что интерфейс «подсказывает» типы, как при присваивании функции в переменную с типом. Класс при этом интерфейс реализует корректно: any совместим со string.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.