Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке тип never?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Тип **never** у TypeScript означає, що "це значення ніколи не існує" або що "функція ніколи не завершиться успішно". Він позначає неможливі випадки: функції, які нічого не повертають і ніколи не завершуються, або гілки коду, які за логікою не можуть виконатися. **Ключове:** `never` - підтип усіх типів, тому сумісний з будь-яким типом, але жоден тип не сумісний з ним.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення### Що таке тип `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` 1. `never` - **підтип усіх типів**, таким чином його можна присвоїти змінній будь-якого типу: ```javascript let n: never; // let x: number = n; // допустимо ``` 2. Але навпаки - не можна: ```javascript let n: never; // n = 5; // Помилка: number не сумісний з never ``` 3. 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` - "ніколи" | | Підтип | Сумісний з усіма типами, але жоден тип не сумісний з ним |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.