🎯 Зачем спрашивают
- Проверяют знание системы типов TS и умение отличать
neverотvoidиany.
- Хотят понять, знаком ли кандидат с приёмами типа «исчерпывающий switch/case».
- Проверяют умение использовать TS для ловли ошибок на этапе компиляции.
📝 Ответ
never — это "тип невозможности".Он нужен для:
- функций, которые не завершаются
- проверки полноты (
exhaustiveness checking)
- уточнения и защиты от ошибок в типах.
Функции, которые никогда не возвращают результат
function fail(message: string): never { throw new Error(message); }
Тип
never показывает, что выполнение этой функции никогда не завершится успешно.Проверка исчерпывающего switch/case
function assertNever(x: never): never { throw new Error(`Unreachable case: ${JSON.stringify(x)}`); } type Shape = | { kind: "circle"; radius: number } | { kind: "square"; side: number }; function area(shape: Shape): number { switch (shape.kind) { case "circle": return Math.PI * shape.radius ** 2; case "square": return shape.side * shape.side; default: // если добавим новый вариант в Shape и не обработаем его выше — // здесь будет ошибка типов (shape не сужается до never) return assertNever(shape); } }
Если добавить новый вариант в
Shape, TypeScript подсветит ошибку в default. Это защищает от забытых кейсов.Тип
never как результат "невозможных" пересечений// never, потому что строка не может быть одновременно "a" и "b" type A = "a" & "b"; // never, потому что переменная не может быть одновременно иметь тип и строки, и числа type B = string & number;
⚖️ Компромиссы
- ✅ Плюсы: помогает ловить ошибки ещё на этапе разработки; делает код более надёжным.
- ❌ Минусы: иногда путают с
void→ может вносить путаницу в команду.
🔎 Встречные вопросы
- Чем отличается
neverотvoidиany?
- В каких случаях
neverвозникает «автоматически» (неявно)?
- Можно ли использовать
neverв generic-коде (например, для условных типов)?
🚩 Красные флаги
- never = это то же самое, что void.
- Используется только для throw.
- Не знает про исчерпывающие проверки.