Выбор ответа 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-переменных и параметров терялось в колбэках: компилятор не знал, не изменится ли переменная до вызова.
Варианты ответа
- Как
string | undefined: внутри замыканий сужение всегда сбрасывается - Как
any: тип параметра в колбэке выводится заново и теряется - Ошибка компиляции: параметры функции нельзя переприсваивать в теле
- Как
string: после присваивания переменная не меняется, сужение сохраняетсяправильный ответ
Разбор
До TS 5.4 сужение let-переменных и параметров терялось в колбэках: компилятор не знал, не изменится ли переменная до вызова. С 5.4 TS проверяет, что после места создания замыкания присваиваний нет, и сохраняет суженный тип. Если ниже по коду переменную снова присвоить, сужение в замыкании пропадёт. Параметры переприсваивать можно, any здесь ниоткуда не берётся.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Assertion function в стрелочной функции
Следующий вопрос
Проверка полноты без assertNever