Утилітарний тип extract у TypeScript
Extract — це утиліта типу в TypeScript, яка витягує з об'єднання типу ті члени, які можуть бути присвоєні іншому вказаному типу. По суті, вона створює нове об'єднання, залишаючи лише "перетинаючі" частини.
Синтаксис
ts
Extract<T, U>T— оригінальний тип об'єднання.U— тип (або об'єднання), члени якого повинні бути збережені зT.
Extract<T, U> зберігає в T лише ті типи, які можуть бути присвоєні U, видаляючи все інше.
Коли використовувати Extract
- Витягування дійсних значень: наприклад, якщо API може повернути
"success" | "error" | "pending", ви можете витягнути лише"error". - Фільтрація за ролями та доступом: з переліку всіх ролей ви можете витягнути лише адміністраторів (
Extract<Role, "admin" | "moderator">). - Оптимізація типу об'єднання: коли потрібно зберегти лише значення конкретного типу.
- Спрощення роботи з генераками: якщо до шаблону передається великий список варіантів,
Extractдопомагає звузити його до потрібних значень.
Приклади
Приклад 1. Витягування чисел та булевих значень
ts
type Mixed = string | number | boolean;
// Витягнути лише числа та булеві значення
type OnlyNumbersOrBooleans = Extract<Mixed, number | boolean>;
// OnlyNumbersOrBooleans = number | boolean- В оригінальному типі
Mixedєstring,numberтаboolean. - Extract залишає лише ті типи, які є
numberабоboolean.
Приклад 2. Приклад API: Фільтрація помилок
ts
type ApiResponse =
| { status: "success"; data: string }
| { status: "error"; message: string }
| null
| undefined;
// Витягнути лише помилки
type ErrorResponse = Extract<ApiResponse, { status: "error" }>;
function handleError(response: ApiResponse) {
if (response && response.status === "error") {
console.log("Error:", response.message);
}
}
// Використання:
const res1: ApiResponse = { status: "success", data: "OK" };
const res2: ApiResponse = { status: "error", message: "Request error" };
handleError(res1); // Нічого не виводить
handleError(res2); // Вивід: "Error: Request error"Що тут відбувається?
Extract<ApiResponse, { status: "error" }>залишає лише ті об'єкти, у яких статус: "error".- Ми використовуємо це для обробки помилок, ігноруючи успішні відповіді та null | undefined.
- Функція handleError перевіряє, чи є відповідь помилкою, і виводить повідомлення.
Це більш реалістичний випадок, оскільки обробка відповідей API є частим завданням у фронтенд-розробці. 🚀
Відмінність від Exclude
| Утиліта | Опис |
|---|---|
Exclude<T, U> | Виключає всі підтипи з T, які сумісні з U |
Extract<T, U> | Залишає лише підтипи з T, які сумісні з U |
Приклад:
ts
type Mixed = string | number | boolean;
type OnlyStrings = Exclude<Mixed, number | boolean>;
// string
type OnlyNumbersOrBooleans = Extract<Mixed, number | boolean>;
// number | booleanКоротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.