Выбор ответа Middle Объединения и сужение обновлено

Функция-утверждение

Вопрос

Какой тип у el в последней строке?

function assertDefined<T>(v: T): asserts v is NonNullable<T> {
  if (v == null) throw new Error('empty');
}
const el = document.querySelector('input');
assertDefined(el);
el.value;

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

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

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

Коротко

Правильный ответ: HTMLInputElement. querySelector('input') знает тег и возвращает HTMLInputElement null.

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

  1. HTMLInputElement | null
  2. HTMLInputElementправильный ответ
  3. Element
  4. never

Разбор

querySelector('input') знает тег и возвращает HTMLInputElement | null. Функция с сигнатурой asserts v is NonNullable<T> говорит компилятору: если вызов вернулся без исключения, значит условие выполнено. После вызова el сужен до HTMLInputElement.

Без asserts осталось бы | null. Element получился бы для произвольного селектора вроде '.x'. never был бы, если бы утверждение исключало все варианты.

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

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