Выбор ответа Senior Дженерики обновлено

strictFunctionTypes: методы и свойства-функции

Вопрос

Включён strictFunctionTypes. Для какого объявления параметр проверяется контравариантно (строго)?

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

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

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

Коротко

Правильный ответ: Для свойства с типом функции: handle: (e: MouseEvent) = void. Флаг включает контравариантную проверку параметров только для типов функций (свойство с функциональным типом, тип-алиас функции).

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

  1. Для свойства с типом функции: handle: (e: MouseEvent) => voidправильный ответ
  2. Для метода: handle(e: MouseEvent): void
  3. Для обоих вариантов одинаково, разница только в стиле
  4. Ни для какого: strictFunctionTypes касается только колбэков в дженериках

Разбор

Флаг включает контравариантную проверку параметров только для типов функций (свойство с функциональным типом, тип-алиас функции). Методы, объявленные синтаксисом метода, намеренно оставлены бивариантными, иначе сломались бы массивы и DOM-типы (Array<Dog> должен оставаться совместимым с Array<Animal> при методе push). Поэтому вариант «одинаково» неверен, а утверждение про дженерики выдумано. Практический вывод: для строгой проверки обработчиков объявляйте их как свойства.

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

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

Термины по теме