Generics TypeScript із прикладами
Універсали TypeScript — це потужна функція, яка дозволяє створювати багаторазові компоненти, безпечні для друку. Універсали надають можливість створювати класи, функції та інтерфейси, які працюють із різноманітними типами, зберігаючи надійну безпеку типів. Ця стаття познайомить вас із дженериками та продемонструє, як їх використовувати на практичних прикладах.
Розуміння генериків
Generics дають змогу визначити компонент за допомогою заповнювача для типу, з яким він працює. Замість вказівки конкретного типу ви використовуєте загальний параметр типу, який можна замінити на будь-який тип під час використання компонента.
Базовий синтаксис
Основний синтаксис для визначення загального типу полягає у використанні кутових дужок <>
з назвою параметра типу. Ось простий приклад:
function identity(value: T): T {
return value;
}
const stringIdentity = identity("Hello"); // string
const numberIdentity = identity(123); // number
У цьому прикладі identity
є загальною функцією, яка приймає параметр value
типу T
і повертає значення того самого типу. Параметр типу T
замінюється фактичним типом під час виклику функції.
Генерики з класами
Генерики також можна використовувати з класами для створення гнучких і багаторазово використовуваних структур даних. Ось приклад загального класу:
class Box {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
const stringBox = new Box("TypeScript");
console.log(stringBox.getValue()); // Output: TypeScript
const numberBox = new Box(42);
console.log(numberBox.getValue()); // Output: 42
У цьому прикладі клас Box
визначено за допомогою параметра загального типу T
. Клас має приватну властивість value
типу T
і метод getValue
, який повертає значення типу T
.
Генерики з інтерфейсами
Generics можна використовувати з інтерфейсами для створення гнучких і типобезпечних інтерфейсів. Ось приклад:
interface Pair<T, U> {
first: T;
second: U;
}
const pair: Pair<string, number> = {
first: "Age",
second: 30
};
console.log(pair.first); // Output: Age
console.log(pair.second); // Output: 30
У цьому прикладі інтерфейс Pair
визначено двома параметрами загального типу T
і U
. Інтерфейс представляє пару значень із типами T
і U
відповідно.
Узагальнення у функціях
Generics можна використовувати у функціях для обробки кількох типів, зберігаючи безпеку типів. Ось приклад загальної функції, яка працює з масивами:
function reverseArray(items: T[]): T[] {
return items.reverse();
}
const reversedStringArray = reverseArray(["one", "two", "three"]);
console.log(reversedStringArray); // Output: ["three", "two", "one"]
const reversedNumberArray = reverseArray([1, 2, 3]);
console.log(reversedNumberArray); // Output: [3, 2, 1]
У цьому прикладі функція reverseArray
приймає масив типу T
і повертає обернений масив того самого типу. Параметр типу T
гарантує, що функція працює з масивами будь-якого типу, зберігаючи безпеку типу.
Обмеження щодо дженериків
Іноді вам може знадобитися накласти обмеження на параметр загального типу, щоб переконатися, що він має певні властивості. Це робиться за допомогою обмежень:
function logLength(item: T): void {
console.log(item.length);
}
logLength("Hello, TypeScript"); // Output: 16
logLength([1, 2, 3]); // Output: 3
// logLength(123); // Error: number does not have a length property
У цьому прикладі функція logLength
обмежена типами, які мають властивість length
. Це дозволяє функції приймати рядки та масиви, але не числа чи інші типи без властивості length
.
Висновок
Generics у TypeScript надають потужний спосіб створювати гнучкі та багаторазово використовувані компоненти, зберігаючи надійну безпеку типів. Розуміючи та використовуючи загальні коди, ви можете писати більш загальний і адаптований код, покращуючи загальну якість і зручність обслуговування ваших програм TypeScript.
Експериментуйте з універсалами у своїх проектах, щоб побачити їхні переваги в дії та покращити свої навички програмування на TypeScript.