Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Runtime-помилки та TS». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**TypeScript** перевіряє типи на етапі компіляції, тобто до того, як код буде виконано, і не дозволяє зібрати проект, якщо щось не збігається за типами. **Ключове:** TypeScript запобігає передбачуваним помилкам коду, але не замінює валідацію даних під час виконання.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Чому TypeScript запобігає **runtime-помилкам** > Тому що TypeScript перевіряє типи **на етапі компіляції**, > тобто **до того, як код буде виконано**. Він аналізує код, знаходить потенційні помилки і не дозволяє зібрати проект, якщо щось "не збігається за типами". Приклад: ```javascript function square(num: number) { return num * num; } square("4"); // Помилка при компіляції ``` У JavaScript цей код впав би **під час виконання (runtime)**, а TypeScript зупиняє помилку **ще на етапі збірки (compile-time)**. > Тому кажуть, що TypeScript "зсуває помилки вліво" - > з продакшену -> у компілятор. --- ## 2. Чому TypeScript **не гарантує 100% відсутність помилок** TypeScript - це **інструмент перевірки типів на етапі компіляції**, але **він не виконує код**, і тому: - не бачить реальні дані під час виконання; - не знає, що прийде з API, бази даних чи користувацького вводу; - не контролює побічні ефекти, логіку та помилки середовища. Приклад: ```javascript function getUserName(): string { return JSON.parse('{"name":123}').name; // TS вважає, що це string } ``` > Компілятор впевнений, що повернеться рядок > Але в runtime - це число, і `.toUpperCase()` потім викличе помилку ```javascript getUserName().toUpperCase(); // Помилка під час виконання ``` **TypeScript перевіряє структуру коду, а не вміст даних.** --- ## 3. Чому TypeScript **не виконує перевірку типів під час виконання** Тому що після компіляції TypeScript **повністю зникає**. Він **видаляє всю інформацію про типи**, залишаючи чистий JavaScript. Приклад: ```javascript // Вихідний код function greet(name: string) { console.log("Hello, " + name); } // Після компіляції в JS: function greet(name) { console.log("Hello, " + name); } ``` > У runtime (у браузері чи Node.js) **жодних типів більше немає**. > JavaScript-рушій не знає, що `name` має бути `string`. TypeScript спочатку спроєктований як: > інструмент **для розробників**, а не для виконання коду. > > Його мета - **попереджати**, а не **захищати під час виконання**. --- ## 4. Чи можна перевірити типи в runtime? Сам TypeScript цього **не робить**, але ти можеш додати **runtime-валідацію** вручну або через бібліотеки: ### Приклади бібліотек: - `zod` - `io-ts` - `runtypes` - `valibot` Приклад із **Zod**: ```javascript import { z } from "zod"; const UserSchema = z.object({ name: z.string(), age: z.number(), }); const data = JSON.parse('{"name":123, "age":"15"}'); const result = UserSchema.safeParse(data); if (!result.success) { console.error("Помилка типів:", result.error.issues); } ``` > Таким чином можна **доповнити статичну типізацію динамічною перевіркою**, > якщо тобі потрібен стовідсотковий захист від помилок. --- ## 5. Підіб'ємо підсумки | Питання | Відповідь | |---|---| | **Чому TS запобігає runtime-помилкам?** | Тому що він **аналізує типи до виконання**, ловить помилки на етапі компіляції. | | **Чому TS не гарантує 100% відсутність помилок?** | Тому що він **не знає реальних даних** у runtime і **не виконує код**. | | **Чому TS не перевіряє типи під час виконання?** | Тому що **всі типи видаляються при компіляції** - залишається чистий JavaScript. | --- ## Ключова ідея > TypeScript - це **щит розробника**, а не **броня застосунку**. > Він запобігає *передбачуваним помилкам коду*, > але не замінює *валідацію даних під час виконання*.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.