Тип за замовчуванням у дженерику
У TypeScript можна вказати тип за замовчуванням для generic-параметра - так само, як і для аргументів функції. Це називається default generic type parameter.
Синтаксис
javascript
type MyType<T = DefaultType> = ...або для функції:
javascript
function myFunc<T = DefaultType>(arg: T) { ... }Якщо під час використання generic-типу/функції тип явно не вказаний, TypeScript візьме значення за замовчуванням.
Приклад 1: тип за замовчуванням у функції
javascript
function wrap<T = string>(value: T): { data: T } {
return { data: value };
}
wrap("hi"); // T = string (за аргументом)
wrap(42); // T = number (інференс)
wrap(); // T = string (тип за замовчуванням)Тут, якщо TypeScript не може вивести тип T, він бере string.
Приклад 2: тип за замовчуванням у type-визначенні
javascript
type Response<T = string> = {
data: T;
success: boolean;
};
const r1: Response = { data: "ok", success: true }; // T = string
const r2: Response<number> = { data: 200, success: true }; // T = numberЧасто застосовують, щоб спростити використання типу без необхідності явно вказувати generic.
Приклад 3: кілька параметрів з різними значеннями за замовчуванням
javascript
type Pair<T = string, U = number> = [T, U];
const a: Pair = ["age", 25]; // [string, number]
const b: Pair<boolean, string> = [true, "ok"]; // [boolean, string]Приклад 4: використання в інтерфейсах
javascript
interface ApiResponse<T = any> {
data: T;
error?: string;
}
const res1: ApiResponse = { data: "ok" }; // T = any
const res2: ApiResponse<number> = { data: 42 }; // T = numberПриклад 5: у функціях з обмеженням (extends)
javascript
function getValue<T extends object = { id: number }>(obj: T): T {
return obj;
}
getValue(); // T = { id: number }Важливо
- Тип за замовчуванням використовується тільки якщо TypeScript не зміг вивести тип.
- Якщо тип можна вивести за аргументом, значення за замовчуванням ігнорується.
- У списку generic-параметрів параметр з дефолтом має йти після параметрів без дефолта:
javascript
// ok
type Example<T, U = string> = ...
// Помилка
type Bad<U = string, T> = ...Підсумок
| Можливість | Приклад | Опис |
|---|---|---|
| Тип за замовчуванням | <T = string> | Використовується, якщо TS не вивів тип |
| У type-визначенні | type Box<T = number> | Універсальна структура |
| У функції | function fn<T = any>() | Часто для fallback-типу |
| З обмеженням | <T extends object = {}> | Можна поєднувати з extends |
| Порядок параметрів | <T, U = string> | Обов'язкові -> потім з дефолтом |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.