Ответ вслух Middle Объединения и сужение обновлено

Сужение типов

Вопрос

Как сузить тип объединения? Что такое дискриминируемое объединение?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Компилятор сужает тип по проверкам: typeof, instanceof, in, сравнение с null, проверка литерала. Дискриминируемое объединение - вариантные типы с общим литеральным полем: switch (s.status) сужает тип в каждой ветке, и s.data доступно только там, где оно существует.

Что должно прозвучать в ответе

  • typeof, instanceof, in и проверка на null - встроенные сужения

  • дискриминируемое объединение - общее литеральное поле-метка

  • switch по метке сужает тип в каждой ветке

  • пользовательский предохранитель: x is Type

  • never в ветке default даёт проверку полноты

  • as не сужает, а заглушает проверку

Что могут спросить следом

  • Как написать свой type guard
  • Что такое проверка полноты через never
  • Почему состояние загрузки лучше объединением, чем тремя булевыми

Разбор

Компилятор сужает тип по проверкам: typeof, instanceof, in, сравнение с null, проверка литерала.

Дискриминируемое объединение - вариантные типы с общим литеральным полем:

type State =
  | { status: 'loading' }
  | { status: 'ready'; data: User[] }
  | { status: 'error'; error: string };

switch (s.status) сужает тип в каждой ветке, и s.data доступно только там, где оно существует. Это лучший способ описать состояние загрузки - невозможные комбинации (loading с данными) просто нельзя выразить.

В default пишут const _: never = s - при добавлении варианта компилятор укажет, где не обработано. А as ничего не сужает: он молча выключает проверку.

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

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