Runtime-помилки та TS
1. Чому TypeScript запобігає runtime-помилкам
Тому що TypeScript перевіряє типи на етапі компіляції, тобто до того, як код буде виконано.
Він аналізує код, знаходить потенційні помилки і не дозволяє зібрати проект, якщо щось "не збігається за типами".
Приклад:
function square(num: number) {
return num * num;
}
square("4"); // Помилка при компіляціїУ JavaScript цей код впав би під час виконання (runtime), а TypeScript зупиняє помилку ще на етапі збірки (compile-time).
Тому кажуть, що TypeScript "зсуває помилки вліво" - з продакшену -> у компілятор.
2. Чому TypeScript не гарантує 100% відсутність помилок
TypeScript - це інструмент перевірки типів на етапі компіляції, але він не виконує код, і тому:
- не бачить реальні дані під час виконання;
- не знає, що прийде з API, бази даних чи користувацького вводу;
- не контролює побічні ефекти, логіку та помилки середовища.
Приклад:
function getUserName(): string {
return JSON.parse('{"name":123}').name; // TS вважає, що це string
}Компілятор впевнений, що повернеться рядок Але в runtime - це число, і
.toUpperCase()потім викличе помилку
getUserName().toUpperCase(); // Помилка під час виконанняTypeScript перевіряє структуру коду, а не вміст даних.
3. Чому TypeScript не виконує перевірку типів під час виконання
Тому що після компіляції TypeScript повністю зникає. Він видаляє всю інформацію про типи, залишаючи чистий 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-валідацію вручну або через бібліотеки:
Приклади бібліотек:
zodio-tsruntypesvalibot
Приклад із Zod:
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 - це щит розробника, а не броня застосунку. Він запобігає передбачуваним помилкам коду, але не замінює валідацію даних під час виконання.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.