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

typeof object и null

Вопрос

Что скажет компилятор при strict: true?

function f(x: string[] | null) {
  if (typeof x === 'object') {
    console.log(x.length);
  }
}

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

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

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

Коротко

Правильный ответ: Ошибка: x possibly null. typeof null === 'object' в JavaScript, и TypeScript это знает: после проверки typeof x === 'object' тип x это string[] null.

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

  1. Внутри if у x тип never
  2. Ошибка: typeof нельзя сравнивать с 'object'
  3. Всё компилируется: x сужен до string[]
  4. Ошибка: x possibly nullправильный ответ

Разбор

typeof null === 'object' в JavaScript, и TypeScript это знает: после проверки typeof x === 'object' тип x это string[] | null. Обращение к length без проверки на null даёт ошибку. Правильно: if (x !== null) или if (Array.isArray(x)).

Сужения до string[] нет как раз из-за null. never получился бы, если бы ни один член объединения не подходил. Сравнивать typeof с 'object' можно.

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

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