Як оголосити функцію з generic-параметром?
Базовий синтаксис
javascript
function name<T>(arg: T): T {
return arg;
}T- generic-параметр (узагальнений тип).- При виклику функції TypeScript сам підставить потрібний тип замість
T.
Приклад 1: проста узагальнена функція
javascript
function identity<T>(value: T): T {
return value;
}
const num = identity(42); // T = number
const str = identity("hello"); // T = stringTypeScript розуміє, що num - це number, а str - string.
Приклад 2: явна вказівка типу при виклику
javascript
function wrapValue<T>(value: T): { data: T } {
return { data: value };
}
const wrapped = wrapValue<string>("text");
// { data: string }Тут ми вручну вказали тип <string>, хоча зазвичай TypeScript робить це автоматично.
Приклад 3: декілька generic-параметрів
javascript
function merge<T, U>(a: T, b: U): T & U {
return Object.assign({}, a, b);
}
const person = merge({ name: "Tim" }, { age: 25 });
// person має тип { name: string; age: number }Можна використовувати декілька generic-параметрів (<T, U, V, ...>).
Приклад 4: з обмеженням (extends)
javascript
function getLength<T extends { length: number }>(value: T): number {
return value.length;
}
getLength("hello"); // string має length
getLength([1, 2, 3]); // масив має length
getLength(123); // number не має lengthextends обмежує, які типи можна підставляти в T.
Приклад 5: з масивами
javascript
function firstElement<T>(arr: T[]): T {
return arr[0];
}
const first = firstElement([1, 2, 3]); // number
const second = firstElement(["a", "b"]); // stringTypeScript виводить тип елементів масиву автоматично.
Підсумок
| Синтаксис | Приклад | Опис |
|---|---|---|
<T> | function foo<T>(x: T): T | Один generic-параметр |
<T, U> | function bar<T, U>(a: T, b: U) | Декілька generic-параметрів |
<T extends SomeType> | function baz<T extends object>(x: T) | Обмеження типу |
<T = DefaultType> | function qux<T = string>(x?: T) | Значення за замовчуванням для generic |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.