Кілька дженериків
Базовий синтаксис
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 = stringGeneric-параметри можуть мати значення за замовчуванням, якщо TypeScript не може їх вивести.
Підсумок
| Можливість | Приклад | Що робить |
|---|---|---|
| Два параметри | <T, U> | Різні типи для різних аргументів |
| Обмеження | <T extends object, U extends object> | Обмежує типи |
| Залежність | <T, K extends keyof T> | Один параметр залежить від іншого |
| Тип за замовчуванням | <T, U = string> | Використовується, якщо не вказано явно |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.