Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Кілька дженериків». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Так**: функція може мати **два і більше обобщених параметри** (`<T, U, V, ...>`), кожен з яких виводиться незалежно, наприклад `function example<T, U>(arg1: T, arg2: U): [T, U]`. **Ключове:** TypeScript сам підставить відповідні типи при виклику функції.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Базовий синтаксис ```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>` | Використовується, якщо не вказано явно |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.