Для чего нужен тип 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 нет возврата вообще).