Выбор ответа Junior Объединения и сужение спрашивают часто обновлено

Сужение по истинности и ноль

Вопрос

Что выведет fmt(0)?

function fmt(n: number | undefined) {
  if (!n) return 'нет данных';
  return n.toFixed(1);
}
console.log(fmt(0));

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

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

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

Коротко

Правильный ответ: 'нет данных'. Проверка !n убирает undefined, но ноль тоже ложное значение, поэтому fmt(0) уходит в ветку «нет данных».

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

  1. '0.0'
  2. 'нет данных'правильный ответ
  3. Ошибка компиляции: n может быть undefined
  4. TypeError в рантайме

Разбор

Проверка !n убирает undefined, но ноль тоже ложное значение, поэтому fmt(0) уходит в ветку «нет данных». Компилятор доволен: после проверки n сужен до number. Ошибка логическая, и типы её не ловят.

'0.0' было бы при проверке n === undefined. Ошибки компиляции нет, потому что сужение сработало. TypeError нет, потому что toFixed не вызывается.

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

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