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

Сужение внутри замыканий (TS 5.4)

Вопрос

Как TS 5.4+ типизирует name внутри колбэка?

function f(name: string | undefined) {
  if (!name) name = 'гость';
  return ['a'].map((x) => x + name.toUpperCase());
}

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

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

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

Коротко

Правильный ответ: Как string: после присваивания переменная не меняется, сужение сохраняется. До TS 5.4 сужение let-переменных и параметров терялось в колбэках: компилятор не знал, не изменится ли переменная до вызова.

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

  1. Как string | undefined: внутри замыканий сужение всегда сбрасывается
  2. Как any: тип параметра в колбэке выводится заново и теряется
  3. Ошибка компиляции: параметры функции нельзя переприсваивать в теле
  4. Как string: после присваивания переменная не меняется, сужение сохраняетсяправильный ответ

Разбор

До TS 5.4 сужение let-переменных и параметров терялось в колбэках: компилятор не знал, не изменится ли переменная до вызова. С 5.4 TS проверяет, что после места создания замыкания присваиваний нет, и сохраняет суженный тип. Если ниже по коду переменную снова присвоить, сужение в замыкании пропадёт. Параметры переприсваивать можно, any здесь ниоткуда не берётся.

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

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