PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Для чего нужен тип never?

Продвинутые темы

Тип `never` нужен для обозначения значений, которых никогда не бывает: функций, не возвращающих управление, невозможных состояний и проверки полноты (exhaustiveness).

Где используется

Функции, не возвращающие управление

function throwError(msg: string): never {
  throw new Error(msg); // не возвращает управление
}
function infiniteLoop(): never {
  while (true) {}
}

Невозможные ветки (после сужения)

function check(x: string | number) {
  if (typeof x === 'string') return;
  if (typeof x === 'number') return;
  x; // never — сюда не дойти
}

Проверка полноты (exhaustiveness check)

Гарантирует обработку всех вариантов union, если добавили новый, компилятор укажет на ошибку:

type Shape = 'circle' | 'square';
function area(s: Shape) {
  switch (s) {
    case 'circle': return 1;
    case 'square': return 2;
    default:
      const _exhaustive: never = s; // ошибка, если Shape расширили
      return _exhaustive;
  }
}

never против void

  • void — функция возвращает управление, но без значения (undefined).
  • never — функция не возвращает управление (throw/бесконечный цикл).

Коротко для собеседования

never нужен для значений, которых не бывает: функции без возврата управления (throw, бесконечный цикл), невозможные ветки после сужения и проверка полноты union (exhaustiveness — компилятор ловит необработанный вариант). Отличается от void (нет значения vs нет возврата вообще).

Другие вопросы раздела