Выбор ответа Middle Классы и интерфейсы обновлено
implements и типы параметров
Вопрос
Что скажет компилятор при strict: true?
interface Handler {
handle(e: string): void;
}
class H implements Handler {
handle(e) {
console.log(e.toUpperCase());
}
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ошибка: параметр e неявно имеет тип any. implements только проверяет класс на соответствие интерфейсу, а типы в класс не переносит.
Варианты ответа
- Ошибка: класс неправильно реализует интерфейс
- Всё компилируется:
eимеет типunknown - Всё компилируется:
eполучает типstringиз интерфейса - Ошибка: параметр
eнеявно имеет типanyправильный ответ
Разбор
implements только проверяет класс на соответствие интерфейсу, а типы в класс не переносит. Параметр e без аннотации получает неявный any, и noImplicitAny из strict даёт ошибку. Нужно написать handle(e: string).
Это частое заблуждение: кажется, что интерфейс «подсказывает» типы, как при присваивании функции в переменную с типом. Класс при этом интерфейс реализует корректно: any совместим со string.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.