TypeScript Academy · Урок

Полные switch и проверки с never

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

Урок 1 из 38 шагов

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

Введение

Цель: создавать исчерпывающие конструкции switch для объединений и использовать never, чтобы обнаруживать пропущенные варианты на этапе компиляции.

Исчерпывающая конструкция switch

Размеченные объединения используют общее поле kind. Конструкция switch по этому полю безопасно сужает тип для каждого варианта.

type Circle = { kind: "circle"; radius: number }
type Square = { kind: "square"; size: number }
type Shape = Circle | Square

function area(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius * s.radius
    case "square":
      return s.size * s.size
  }
}

Когда объединения расширяются

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

type Triangle = { kind: "triangle"; base: number; height: number }
// If we extend Shape but forget to add case, we want a compile-time error
// type Shape = Circle | Square | Triangle

assertNever

Параметр assertNever должен иметь тип never. Если новый вариант попадёт в ветку default, компиляция завершится с ошибкой.

function assertNever(x: never): never {
  throw new Error(`Unhandled case: ${String(x)}`)
}

function areaSafe(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius * s.radius
    case "square":
      return s.size * s.size
    default:
      return assertNever(s) // if Shape grows, compiler errors here
  }
}

Литеральные объединения

Тот же подход работает для объединений строковых литералов: обработайте каждое возможное значение и вызовите assertNever в ветке default.

type Status = "idle" | "loading" | "success" | "error"

function toIcon(s: Status) {
  switch (s) {
    case "idle": return "⏸"
    case "loading": return "⏳"
    case "success": return "✅"
    case "error": return "⚠️"
    default: return assertNever(s)
  }
}

// Alternative: const check
const _check: never = ((): Status => "idle")() as never // force compile-time check with care

Советы

Советы: включите noFallthroughCasesInSwitch; отдавайте предпочтение размеченным объединениям; используйте default только для assertNever.

// Tips
// - Enable noFallthroughCasesInSwitch in tsconfig for safer switches
// - Prefer discriminated unions over boolean flags
// - Keep default branch only to call assertNever; avoid swallowing cases

Проверка assertNever

Быстрая проверка: каково назначение assertNever в исчерпывающей конструкции switch?

Повторение

Повторение: размеченные объединения и исчерпывающая конструкция switch делают код безопаснее. never и assertNever обнаруживают пропущенные варианты при компиляции.

Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
101
Уроки
352

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

Урок «Полные switch и проверки с never» бесплатный?

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

Чему я научусь в уроке «Полные switch и проверки с never»?

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

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

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

Сколько времени занимает урок «Полные switch и проверки с never»?

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

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

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

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

  1. Полные switch и проверки с never
  2. Функции-предикаты и оператор satisfies
  3. Уточнение объединений на границах функций
← Назад к TypeScript Academy