Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що означає тип unknown?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Тип `unknown` - це **безпечна альтернатива** типу `any`. Тип значення невідомий заздалегідь, і перш ніж використовувати його, потрібно перевірити тип (звуження типу). **Ключове:** `unknown` дозволяє присвоювати будь-яке значення, але не дозволяє використовувати його без попередньої перевірки типу.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення### Що означає тип `unknown` в TypeScript Тип `unknown` - це **безпечна альтернатива** типу `any`. Він означає: > «Тип значення **невідомий заздалегідь**, і перш ніж використовувати його, > потрібно **перевірити тип** (звуження типу).» Іншими словами - `unknown` говорить TypeScript: > «Я не знаю, що це за значення, але хочу безпечно з ним працювати.» --- ### Приклад базового використання ```javascript let value: unknown; value = 42; value = "Привіт"; value = { name: "Tim" }; value = true; ``` Так можна присвоювати `unknown` **будь-яке значення**, але **не можна використовувати його без перевірки**. --- ### У чому відмінність від `any` | Операція | `any` | `unknown` | | --- | --- | --- | | Можна присвоювати будь-які значення | так | так | | Можна виконувати будь-які операції | так | ні (потрібно перевірити тип) | | Безпека типів | ні | так | | Потрібно звужувати тип перед використанням | ні | так | Приклад: ```javascript let a: any = 10; a.toUpperCase(); // помилка з'явиться тільки під час виконання let b: unknown = 10; // b.toUpperCase(); // помилка на етапі компіляції - TypeScript не знає, що це рядок ``` Щоб використати `unknown`, потрібно **спочатку перевірити тип**: ```javascript if (typeof b === "string") { console.log(b.toUpperCase()); // тепер можна } ``` --- ### Приклади використання `unknown` #### 1. При роботі із зовнішніми даними (наприклад, API) ```javascript function parseJSON(input: string): unknown { return JSON.parse(input); } const result = parseJSON('{"name": "Tim"}'); // console.log(result.name); // не можна if (typeof result === "object" && result !== null && "name" in result) { console.log((result as { name: string }).name); // безпечно } ``` #### 2. При динамічних типах даних ```javascript function handleInput(data: unknown) { if (typeof data === "number") { console.log(data.toFixed(2)); } else if (typeof data === "string") { console.log(data.toUpperCase()); } else { console.log("Невідомий тип"); } } ``` --- ### Особливості типу `unknown` 1. `unknown` **- це супертип усіх типів**, тобто йому можна присвоїти **що завгодно**: ```javascript let x: unknown; x = 123; x = "рядок"; x = true; ``` 2. Але навпаки - не можна присвоїти `unknown` змінній іншого типу без перевірки: ```javascript let y: number; let x: unknown = 10; // y = x; // помилка - потрібно явно звузити або привести тип y = x as number; // коректно ``` 3. Тип `unknown` - **"верхній" тип системи типів TypeScript** (аналог `any`, але безпечний): ```javascript never ⊂ string ⊂ unknown ``` --- ### Приклад: порівняння `unknown` і `any` ```javascript function testAny(value: any) { value.foo.bar(); // компілюється, але вибухне в рантаймі } function testUnknown(value: unknown) { // value.foo.bar(); // помилка під час компіляції - безпечно if (typeof value === "object" && value !== null) { console.log("Об'єкт:", value); } } ``` --- ### Коротка зведена таблиця | Властивість | Опис | | --- | --- | | Тип | Примітивний службовий | | Призначення | Безпечний аналог `any` | | Можна присвоїти | Будь-яке значення | | Можна використовувати | Лише після перевірки типу | | Типізація | Строга та безпечна | | Де використовується | Невідомі дані (API, `JSON.parse`, введення користувача) | --- ### Підсумок - `any` - "Роби що хочеш, TypeScript не перевіряє." - `unknown` - "Ти можеш зберігати що завгодно, **але доведи**, що це безпечно."Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.