Skip to main content

Кілька дженериків

Базовий синтаксис

javascript
function example<T, U>(arg1: T, arg2: U): [T, U] { return [arg1, arg2]; }
  • T і U - два обобщені параметри (можна задати й більше: <T, U, V, ...>).
  • Кожен параметр типу виводиться незалежно.
  • TypeScript сам підставить відповідні типи при виклику.

Приклад 1: пара значень різних типів

javascript
function pair<T, U>(first: T, second: U): [T, U] { return [first, second]; } const a = pair("age", 25); // T = string, U = number // результат: [string, number]

Виведення типів відбувається автоматично: T став string, U - number.


Приклад 2: об'єднання об'єктів

javascript
function merge<T, U>(a: T, b: U): T & U { return Object.assign({}, a, b); } const user = merge({ name: "Tim" }, { age: 25 }); // user: { name: string; age: number }

Тут T і U описують типи обох аргументів, а тип, що повертається, - їхній перетин (&).


Приклад 3: використання обмежень (extends)

javascript
function combine<T extends object, U extends object>(obj1: T, obj2: U): T & U { return { ...obj1, ...obj2 }; } combine({ id: 1 }, { name: "Alex" }); // OK combine({ id: 1 }, 42); // Помилка - number не підходить під object

Обмеження (extends) дозволяють контролювати, які типи дозволені.


Приклад 4: залежні параметри

javascript
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; } const user = { name: "Tim", age: 25 }; const name = getProperty(user, "name"); // T = { name: string; age: number }, K = "name" // name має тип string

Тут K залежить від T: це ключ об'єкта T. TypeScript знає, що key повинен бути коректним ключем цього об'єкта.


Приклад 5: з типом за замовчуванням

javascript
function wrap<T, U = string>(value: T, note?: U): { value: T; note: U } { return { value, note: note as U }; } wrap(123); // T = number, U = string (за замовчуванням) wrap(true, "flagged"); // T = boolean, U = string

Generic-параметри можуть мати значення за замовчуванням, якщо TypeScript не може їх вивести.


Підсумок

МожливістьПрикладЩо робить
Два параметри<T, U>Різні типи для різних аргументів
Обмеження<T extends object, U extends object>Обмежує типи
Залежність<T, K extends keyof T>Один параметр залежить від іншого
Тип за замовчуванням<T, U = string>Використовується, якщо не вказано явно

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

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

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