Вопрос с собеседования · Frontend

Что такое сужение типов в TypeScript?

JuniorTypeScript
Ещё спрашивают так:
  • Как работать с union-типами?
  • Что такое type guard?
Коротко

Если переменная имеет тип-объединение (string | number, User | null), TypeScript позволяет использовать только общее. Проверка внутри кода сужает тип в ветке: typeof (примитивы), instanceof (классы), in (наличие свойства), сравнение с null, дискриминант (общее поле type у вариантов). Свои проверки — type guard function isUser(x): x is User.

  • Дискриминированные объединения + switch — надёжная модель состояний
  • Проверка never в default ловит необработанный вариант
  • Оператор ! (non-null) отключает проверку — использовать редко

Подробно

type State = { status: 'loading' } | { status: 'ok'; data: User } | { status: 'error'; message: string };
function view(s: State) {
  if (s.status === 'ok') return s.data.name; // s сужен до варианта ok
}

Что хотят услышать

  • Сужение через typeof, in, сравнение.
  • Дискриминированные объединения.
  • Type guard.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗TypeScript сам угадывает тип union без проверок
  • ✗Сужение типов работает только в рантайме, компилятор о нём не знает
  • ✗Оператор ! — лучший способ работы с null
  • ✓typeof, instanceof, in или поле-дискриминант сужают тип в ветке; свои — type guard

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования