Сужение типов
Вопрос
Как сузить тип объединения? Что такое дискриминируемое объединение?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.