TypeScript Academy · Урок

Проверка полноты с помощью never

Используйте never, чтобы убедиться в обработке всех вариантов объединения

Урок 4 из 413 шагов

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

Добро пожаловать

Проверка полноты использует тип `never`, чтобы убедиться, что обработан каждый вариант объединения. Если вы добавите новый вариант объединения, TypeScript точно укажет, где нужно обновить код.

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

Если при переключении по объединяющему типу забыть вариант, JavaScript молча перейдёт к следующему участку. TypeScript может обнаружить это с помощью проверки типа без значений.
type Shape = 'circle' | 'square';
function area(s: Shape): number {
  if (s === 'circle') return 3.14;
  if (s === 'square') return 1;
  // What if we add 'triangle'?
}

Шаблон проверки полноты с never

Присвойте оставшееся значение типу `never`. Если TypeScript выводит тип, отличный от never, это означает, что один из вариантов не обработан.
function assertNever(x: never): never {
  throw new Error('Unexpected value: ' + x);
}
function area(s: Shape): number {
  switch (s) {
    case 'circle': return 3.14;
    case 'square': return 1;
    default: return assertNever(s);
  }
}

Добавление нового члена объединения

Если добавить 'triangle' в объединение Shape, TypeScript выдаст ошибку в `assertNever(s)` и сообщит, что необходимо обработать новый вариант.
type Shape = 'circle' | 'square' | 'triangle';
// Now TypeScript errors on assertNever(s) because s is 'triangle'
// — it's not never!

Встроенная проверка never

Проверку полноты можно выполнить непосредственно в коде без вспомогательной функции.
function handle(shape: Shape): string {
  switch (shape.kind) {
    case 'circle': return 'circle';
    case 'square': return 'square';
    default:
      const _: never = shape; // Error if not exhaustive
      throw new Error('Unknown shape');
  }
}

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

Используйте тот же приём в цепочках if/else.
function process(action: Action): void {
  if (action.type === 'A') { /* ... */ }
  else if (action.type === 'B') { /* ... */ }
  else {
    const _: never = action; // exhaustive
  }
}

never в ограничениях обобщённых типов

never — это нижний тип. Он полезен в условных типах для представления невозможных ветвей.
type NonNullable<T> = T extends null | undefined ? never : T;
// Removes null and undefined from T

Использование never для невозможных состояний

Тип never полезен для моделирования состояний, которые должны быть невозможны в вашей системе типов.
type State<T> =
  | { kind: 'loading' }
  | { kind: 'success'; data: T }
  | { kind: 'error'; msg: string };
// There should never be a state with kind: 'unknown'

never в условных типах

Тип never используется в условных типах для отфильтровывания ненужных членов типов.
type NonFunctions<T> = {
  [K in keyof T]: T[K] extends Function ? never : K
}[keyof T];
// Returns keys whose values are not functions

never распространяется через объединения

Тип never является нейтральным элементом для объединений типов: T | never = T.
type T = string | never; // string
type U = never | number | never; // number

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

В каждом проекте TypeScript должна быть простая служебная функция assertNever для проверки полноты.
function assertNever(value: never, message?: string): never {
  throw new Error(message ?? `Unhandled: ${JSON.stringify(value)}`);
}

Быстрая проверка

Что произойдёт в строке `default: assertNever(s)`, если у `s` всё ещё есть возможный необработанный тип?

Итоги

Используйте assertNever(x: never) в ветках default конструкции switch, чтобы получать ошибки компиляции, когда члены объединения не обработаны. Это помогает сохранять корректность кода по мере расширения объединения.
Можно начать бесплатно

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

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

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

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

Урок «Проверка полноты с помощью never» бесплатный?

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

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

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

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

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

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

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

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

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

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

  1. Сужение типов с помощью typeof и проверки истинности
  2. Сужение типов с помощью instanceof и in
  3. Пользовательские функции проверки типов
  4. Проверка полноты с помощью never
← Назад к TypeScript Academy