Чим дженерики відрізняються від any?
1. Головна відмінність
| Особливість | any | generics |
|---|---|---|
| Типізація | Вимикає перевірку типів | Зберігає інформацію про тип |
| Безпека | Втрата типобезпеки | Повна типобезпека |
| Підстановка типів | Тип невідомий | Тип підставляється автоматично |
| Призначення | Швидко "заткнути" помилку типів | Створити універсальну і типобезпечну функцію/тип |
2. Приклад з any
javascript
function identity(value: any): any {
return value;
}
const result = identity("Hello");
result.toFixed(); // Помилка з'явиться лише в runtimeTypeScript не знає, що result - рядок, і спокійно дозволяє викликати toFixed(), що призведе до помилки під час виконання.
3. Приклад з generics
javascript
function identity<T>(value: T): T {
return value;
}
const result = identity("Hello");
result.toUpperCase(); // Все коректно
result.toFixed(); // Помилка на етапі компіляціїT зберігає інформацію про тип (string), і TypeScript знає, які методи доступні.
4. Дженерики "гнучкі", але типізовані
javascript
function merge<T, U>(a: T, b: U): T & U {
return Object.assign({}, a, b);
}
const person = merge({ name: "Tim" }, { age: 25 });
// person має тип { name: string; age: number }При any TypeScript не зміг би вивести точний тип об'єднаного об'єкта.
5. Чому any небезпечний
javascript
let value: any = 5;
value = "text";
value = true;
value.push(1); // Помилка лише в runtimeany ламає всі гарантії типізації - TypeScript перестає вам допомагати.
6. Коли використовувати
| Коли використовувати | Чому |
|---|---|
generics | Коли хочете гнучкість і типобезпеку (бібліотеки, утиліти, React-хуки тощо) |
any | Лише як тимчасове рішення під час міграції або складної типізації |
Підсумок
any- «вимикач» типізації.generics- «розумна абстракція», яка підлаштовується під типи, але їх не втрачає.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.