Skip to main content
Практика завдань

Що таке generic у TypeScript

Generic в TypeScript — це можливість створювати універсальні компоненти та функції, які можуть працювати з будь-якими типами даних, зберігаючи типову безпеку. Використовуючи Generic, ви можете створювати функції, класи та інтерфейси, які можуть працювати з різними типами, не втрачаючи суворого типізування.

Чому Generics?

  1. Гнучкість: Generics дозволяють створювати універсальні функції та класи, які можуть працювати з різними типами даних. Це дозволяє уникати дублювання коду, забезпечуючи при цьому типову безпеку.
  2. Повторне використання коду: Generics дозволяють писати код, який може бути повторно використаний для різних типів, покращуючи читабельність та зменшуючи повторення.
  3. Типова безпека: Використання Generics забезпечує перевірку типів під час компіляції, що допомагає уникнути помилок, пов'язаних з неправильним використанням типів.

Generics у функціях

Використовуючи Generic, ви можете створювати функції, які приймають параметри різних типів, в той час як TypeScript буде відстежувати типи даних.

Приклад:

typescript
function identity<T>(arg: T): T { return arg; } let output1 = identity<string>("Hello"); let output2 = identity<number>(100);

У цьому прикладі T — це загальний тип, який буде автоматично визначено на основі типу переданого аргументу. Функція identity повертає значення того ж типу, що й переданий аргумент.

Generics з масивами

Ми можемо створювати функції для роботи з масивами, де елементи масиву можуть бути будь-якого типу.

typescript
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 можуть використовуватися в інтерфейсах для створення більш гнучких і універсальних структур даних.

typescript
interface Box<T> { value: T; } let box1: Box<string> = { value: "Hello" }; let box2: Box<number> = { value: 100 };

У цьому прикладі Box — це універсальний інтерфейс, який може працювати з будь-якими типами, а тип даних буде встановлено під час створення екземпляра інтерфейсу.

Generics в класах

Generics також можуть використовуватися в класах для створення універсальних класів.

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

typescript
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, отже, функція може працювати лише з типами, такими як рядки або масиви.

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

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

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

Дочитали статтю?
Практика завдань