Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Чому TS не вимагає завжди писати типи явно?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)TypeScript сам "розуміє" типи з контексту: коли ти оголошуєш змінну і присвоюєш їй значення, TypeScript **аналізує це значення** і **автоматично присвоює** йому відповідний тип. Цей процес називається **type inference** (виведення типів). **Ключове:** тип виводиться з присвоєного значення, тому писати його явно не завжди обов'язково.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. TypeScript сам "розуміє" типи з контексту Коли ти оголошуєш змінну і присвоюєш їй значення, TypeScript **аналізує це значення** і **автоматично присвоює** йому відповідний тип. ```javascript let name = "Alice"; // TS розуміє: name має тип string ``` > Тому писати `let name: string = "Alice"` - необов'язково. > TypeScript сам виведе тип `string` із присвоєного значення. --- ## 2. Це називається **type inference** (виведення типів) TypeScript уміє "вгадувати" тип: - із **присвоєного значення** (`let count = 5` -> `number`); - із **значення, яке повертає функція**; - із **типу аргументів функції**; - із **контексту виклику** (наприклад, у колбеках, деструктуризації тощо). Приклад: ```javascript function greet(name = "гість") { return `Привіт, ${name}!`; } // TypeScript виводить: name - string, тип, що повертається, - string ``` --- ## 3. Приклад: функція з виведенням типу значення, що повертається ```javascript function add(a: number, b: number) { return a + b; } ``` TypeScript автоматично визначає, що функція повертає `number`, тому що `a` і `b` - числа. > Тобто можна не писати `: number` після дужок - тип виведеться сам. --- ## 4. Приклад з масивами й об'єктами ```javascript let numbers = [1, 2, 3]; // TypeScript виводить тип: number[] let user = { id: 1, name: "Tim" }; // TypeScript виводить тип: { id: number; name: string; } ``` > Якщо пізніше ти спробуєш додати до `numbers` рядок - компілятор не дозволить, > тому що вже знає, що це масив чисел. --- ## 5. Чому це корисно 1. **Менше коду** - не потрібно дублювати очевидні типи. 2. **Код чистіший і читабельніший** - типи залишаються там, де вони справді потрібні. 3. **Типи все одно є** - навіть якщо ти їх не пишеш, TypeScript зберігає їх "в умі". 4. **Автодоповнення в IDE** так само працює (TS знає inferred-типи). --- ## 6. Але іноді потрібно писати типи явно TypeScript не завжди може точно вивести тип, наприклад: - при ініціалізації змінної без значення; - при поверненні складних типів (`Promise`, `union`, `generic`); - коли важливо **зафіксувати** тип (щоб не змінювався динамічно). Приклад: ```javascript let id; // тип any - без анотації TypeScript не знає, що це id = 5; // тепер number id = "5"; // теж допустимо - тип став any // Краще явно: let id: number; ``` --- ## 7. Правило "розумної надлишковості" TypeScript намагається **не змушувати тебе писати те, що й так очевидно**. Типи потрібні там, де: - компілятор не може їх вивести, - або де вони важливі для **чіткого контракту** між частинами коду (наприклад, інтерфейси, функції, API). --- ## Підсумок > TypeScript **не вимагає завжди писати типи**, > тому що він уміє **автоматично виводити їх** з контексту коду - > цей процес називається **type inference**. > > Це робить код **чистим, але водночас безпечним**, > зберігаючи всі переваги типізації без надлишковості.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.