0Pricing
TypeScript Academy · Урок

Полная обработка ошибок с дискриминируемыми объединениями

Пишите исчерпывающие обработчики для дискриминируемых объединений с помощью switch+never, вспомогательных утилит и проверок покрытия на этапе компиляции в разных модулях.

«Полная обработка ошибок с дискриминируемыми объединениями» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 2. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 2 уроков всего.

Введение

Цель: гарантировать обработку каждого варианта объединения. Вы будете использовать оператор выбора с never, небольшую утилиту exhaustiveCheck и узнаете, как сохранять полноту проверки между файлами.

  • Различители (поля tag)
  • Полные операторы выбора
  • Завершение сбоем по умолчанию

Объединение с различаемыми вариантами

Объединение с различаемыми вариантами имеет общий различитель (здесь kind). Каждый вариант содержит собственные данные.

export type Payment =
  | { kind: "Card"; last4: string }
  | { kind: "Cash" }
  | { kind: "Wire"; iban: string }

Оператор выбора и never

Ветка по умолчанию присваивает p типу never. Если позже добавить новый вариант, компилятор сообщит об ошибке, пока Вы его не обработаете.

export function describe(p: Payment): string {
  switch (p.kind) {
    case "Card": return `Card ••••${p.last4}`
    case "Cash": return "Cash"
    case "Wire": return `Wire ${p.iban}`
    default: {
      const _exhaustive: never = p
      return _exhaustive
    }
  }
}

Вспомогательная функция exhaustiveCheck

Используйте небольшую вспомогательную функцию, чтобы явно показать намерение. Параметр never превращает необработанные случаи в ошибку типов, а не просто в исключение во время выполнения.

export function exhaustiveCheck(x: never): never {
  throw new Error(`Unhandled case: ${JSON.stringify(x)}`)
}

export function pay(p: Payment): string {
  switch (p.kind) {
    case "Card": return "charged card"
    case "Cash": return "took cash"
    case "Wire": return "initiated wire"
    default: return exhaustiveCheck(p)
  }
}

Полнота проверки между модулями

Если объединения определены в одном файле, а обрабатываются в другом, добавление новой ветви все равно нарушает сборки, пока не будут обновлены все операторы выбора — именно этого мы и хотим.

// errors.ts
export type AppError =
  | { tag: "Auth"; reason: "Unauthorized" | "Forbidden" }
  | { tag: "NotFound"; resource: string }
  | { tag: "Conflict"; resource: string }

// handler.ts
import type { AppError } from "./errors"
import { exhaustiveCheck } from "./exhaustive"

export function toStatus(e: AppError): number {
  switch (e.tag) {
    case "Auth": return e.reason === "Unauthorized" ? 401 : 403
    case "NotFound": return 404
    case "Conflict": return 409
    default: return exhaustiveCheck(e)
  }
}

Советы и подводные камни

Советы:

  • Предпочитайте различители в виде строковых литералов (например, tag/kind).
  • Делайте варианты небольшими; объединяйте данные во вложенных объектах вместо создания огромных объединений.
  • Никогда не используйте default без проверки never: это скрывает необработанные случаи.

Проверка полноты обработки

Быстрая проверка: что обеспечивает обработку всех вариантов?

Итоги

Итоги: используйте различитель, напишите оператор выбора, а в ветке по умолчанию присваивайте значение типу never (или вызывайте exhaustiveCheck), чтобы гарантировать полную обработку по мере развития объединений.

Часто задаваемые вопросы

Урок «Полная обработка ошибок с дискриминируемыми объединениями» бесплатный?

Да — полный текст урока «Полная обработка ошибок с дискриминируемыми объединениями» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 2 уроков всего.

Чему я научусь в уроке «Полная обработка ошибок с дискриминируемыми объединениями»?

Пишите исчерпывающие обработчики для дискриминируемых объединений с помощью switch+never, вспомогательных утилит и проверок покрытия на этапе компиляции в разных модулях. Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 2.

Сколько времени занимает урок «Полная обработка ошибок с дискриминируемыми объединениями»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Типы в стиле Result/Either
  2. Полная обработка ошибок с дискриминируемыми объединениями
← Назад к TypeScript Academy