Що таке тип never?
Що таке тип never у TypeScript
Тип never у TypeScript означає:
«це значення ніколи не існує» або «функція ніколи не завершиться успішно».
Він використовується, щоб позначити неможливі випадки:
- функції, які нічого не повертають і ніколи не завершуються,
- гілки коду, які за логікою не можуть бути виконані.
Приклади, де використовується never
1. Функції, які викидають помилку
Якщо функція завжди викидає виняток, вона не повертає жодного значення -
отже, її тип, що повертається, never.
javascript
function throwError(message: string): never {
throw new Error(message);
}2. Функції, які ніколи не завершуються (наприклад, нескінченний цикл)
javascript
function infiniteLoop(): never {
while (true) {
console.log("Працюю нескінченно...");
}
}Така функція не повертає значення і не завершує виконання - отже, never.
3. Перевірка вичерпних випадків (exhaustive check)
Один із найкорисніших сценаріїв:
TypeScript використовує never, щоб гарантувати, що опрацьовані всі варіанти у switch або if-розгалуженнях.
javascript
type Shape = "circle" | "square";
function getArea(shape: Shape): number {
switch (shape) {
case "circle":
return Math.PI * 2 ** 2;
case "square":
return 4 * 4;
default:
// якщо з'явиться нова форма - TS видасть помилку
const _exhaustiveCheck: never = shape;
throw new Error(`Unknown shape: ${_exhaustiveCheck}`);
}
}Якщо пізніше додати
type Shape = "circle" | "square" | "triangle", TypeScript видасть помилку на рядкуconst _exhaustiveCheck: never = shape;
- тому що
"triangle"не опрацьовується.
Відмінність never від інших типів
| Тип | Опис |
|---|---|
void | Функція повертає "нічого", але завершується |
never | Функція ніколи не завершується (помилка або нескінченний цикл) |
undefined | Значення є, але не визначене |
null | Навмисна відсутність значення |
Приклад для порівняння:
javascript
function log(): void {
console.log("Просто лог");
}
function crash(): never {
throw new Error("Помилка!");
}Особливості типу never
never- підтип усіх типів, таким чином його можна присвоїти змінній будь-якого типу:
javascript
let n: never;
// let x: number = n; // допустимо- Але навпаки - не можна:
javascript
let n: never;
// n = 5; // Помилка: number не сумісний з never- TypeScript автоматично виводить
neverу ситуаціях, де змінна ніколи не може мати значення:
javascript
function process(value: string | number) {
if (typeof value === "string") {
console.log(value.toUpperCase());
} else if (typeof value === "number") {
console.log(value.toFixed(2));
} else {
// value тут має тип never
console.log(value);
}
}Підсумок
| Властивість | Опис |
|---|---|
| Тип | Примітивний |
| Значення | Не має |
| Де використовується | Помилки, нескінченні цикли, неможливі гілки |
Відмінність від void | void повертає "нічого", never - "ніколи" |
| Підтип | Сумісний з усіма типами, але жоден тип не сумісний з ним |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.