Skip to main content

Runtime-помилки та TS

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 - це щит розробника, а не броня застосунку. Він запобігає передбачуваним помилкам коду, але не замінює валідацію даних під час виконання.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.