← Назад к вопросам
Для чего используется never в TypeScript?
2.0 Middle🔥 221 комментариев
#JavaScript Core#TypeScript
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Тип never в TypeScript
never — это специальный тип в TypeScript, который означает, что значение никогда не будет существовать. Это самый узкий тип в системе типов TypeScript. Используется в нескольких ключевых сценариях.
Основное предназначение
never используется для:
- Обозначения функций, которые никогда не возвращаются
- Недостижимого кода
- Исчерпывающей проверки типов (exhaustive checks)
- Обозначения пустого типа (особенно в типовых функциях)
Сценарий 1: Функции, которые никогда не возвращаются
function throwError(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {
// ...
}
}
const user = getUserFromAPI();
if (!user) {
throwError("User not found");
}
console.log(user.name);
Типизация таких функций помогает TypeScript понимать control flow и избегать потенциальных ошибок.
Сценарий 2: Исчерпывающая проверка типов
Это критически важно при работе с union types и discriminated unions:
type Status = "loading" | "success" | "error";
function handleStatus(status: Status): string {
switch (status) {
case "loading":
return "Loading...";
case "success":
return "Success!";
case "error":
return "Error";
default:
const exhaustiveCheck: never = status;
return exhaustiveCheck;
}
}
Если позже добавить новый статус в union, TypeScript сразу укажет на ошибку в switch, заставляя обработать новый case.
Сценарий 3: Недостижимый код
function getStatusMessage(code: number): string {
if (code === 200) {
return "OK";
}
if (code === 404) {
return "Not Found";
}
const exhaustive: never = code;
return exhaustive;
}
Сценарий 4: Типовые функции и условные типы
type NonNullable<T> = T extends null | undefined ? never : T;
type Example = NonNullable<string | null>;
type Example2 = NonNullable<number | undefined>;
Практический пример: обработка данных с API
type ApiResponse =
| { status: "loading" }
| { status: "success"; data: string[] }
| { status: "error"; error: string };
function processResponse(response: ApiResponse): void {
switch (response.status) {
case "loading":
console.log("Loading...");
break;
case "success":
console.log("Data:", response.data);
break;
case "error":
console.error("Error:", response.error);
break;
default:
const _exhaustiveCheck: never = response;
return _exhaustiveCheck;
}
}
Почему never важен
- Безопасность типов — гарантирует, что вы обработали все возможные случаи
- Рефакторинг — при добавлении новых типов в union, TypeScript сразу укажет на незаконченный код
- Ясность намерений — показывает, что функция никогда не вернёт значение или код является недостижимым
- Предотвращение ошибок — помогает выявить баги на этапе разработки, а не в production
never — это мощный инструмент для написания надёжного и type-safe кода на TypeScript.