Що таке generic у TypeScript
Generic в TypeScript — це можливість створювати універсальні компоненти та функції, які можуть працювати з будь-якими типами даних, зберігаючи типову безпеку. Використовуючи Generic, ви можете створювати функції, класи та інтерфейси, які можуть працювати з різними типами, не втрачаючи суворого типізування.
Чому Generics?
- Гнучкість: Generics дозволяють створювати універсальні функції та класи, які можуть працювати з різними типами даних. Це дозволяє уникати дублювання коду, забезпечуючи при цьому типову безпеку.
- Повторне використання коду: Generics дозволяють писати код, який може бути повторно використаний для різних типів, покращуючи читабельність та зменшуючи повторення.
- Типова безпека: Використання Generics забезпечує перевірку типів під час компіляції, що допомагає уникнути помилок, пов'язаних з неправильним використанням типів.
Generics у функціях
Використовуючи Generic, ви можете створювати функції, які приймають параметри різних типів, в той час як TypeScript буде відстежувати типи даних.
Приклад:
function identity<T>(arg: T): T {
return arg;
}
let output1 = identity<string>("Hello");
let output2 = identity<number>(100);У цьому прикладі T — це загальний тип, який буде автоматично визначено на основі типу переданого аргументу. Функція identity повертає значення того ж типу, що й переданий аргумент.
Generics з масивами
Ми можемо створювати функції для роботи з масивами, де елементи масиву можуть бути будь-якого типу.
function logArray<T>(arr: T[]): void {
arr.forEach(item => console.log(item));
}
logArray([1, 2, 3]); // number[]
logArray(["a", "b", "c"]); // string[]У цьому прикладі функція logArray приймає масив з будь-якими типами даних і виводить його елементи в консоль.
Generics в інтерфейсах
Generics можуть використовуватися в інтерфейсах для створення більш гнучких і універсальних структур даних.
interface Box<T> {
value: T;
}
let box1: Box<string> = { value: "Hello" };
let box2: Box<number> = { value: 100 };У цьому прикладі Box — це універсальний інтерфейс, який може працювати з будь-якими типами, а тип даних буде встановлено під час створення екземпляра інтерфейсу.
Generics в класах
Generics також можуть використовуватися в класах для створення універсальних класів.
class Box<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
const box1 = new Box<string>("Hello");
const box2 = new Box<number>(100);
console.log(box1.getValue()); // "Hello"
console.log(box2.getValue()); // 100У цьому прикладі клас Box використовує Generic для роботи з різними типами даних, що дозволяє створювати екземпляри з різними типами значень.
Generic обмеження
Ви можете обмежити типи, які можуть бути використані в Generic, використовуючи обмеження. Наприклад, ви можете вказати, що параметр типу повинен бути об'єктом з певною властивістю.
function logLength<T extends { length: number }>(arg: T): void {
console.log(arg.length);
}
logLength("Hello"); // 5
logLength([1, 2, 3]); // 3Тут T розширює { length: number }, що вказує на те, що T повинен бути об'єктом з властивістю length, отже, функція може працювати лише з типами, такими як рядки або масиви.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.