Загрузка...
Загрузка...
Extract — это utility тип в TypeScript, который извлекает из union-типа те члены, которые можно присвоить другому указанному типу. По сути, он создаёт новое объединение, оставляя только «пересекающиеся» части.
Extract<T, U>
T — исходный union-тип (объединение).U — тип (или union), члены которого нужно оставить из T.Extract<T, U> сохраняет в T только те типы, которые можно присвоить U, убирая всё остальное.
"success" | "error" | "pending", можно вычленить только "error".Extract<Role, "admin" | "moderator">).Extract поможет сузить его до нужных значений.Пример 1. Извлечение чисел и булевых значений
type Mixed = string | number | boolean;
// Извлекаем только числа и булевы значения
type OnlyNumbersOrBooleans = Extract<Mixed, number | boolean>;
// OnlyNumbersOrBooleans = number | boolean
Mixed есть string, number, и boolean.number или boolean.Пример 2. Пример с API: Фильтрация ошибок
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("Ошибка:", response.message);
}
}
// Использование:
const res1: ApiResponse = { status: "success", data: "OK" };
const res2: ApiResponse = { status: "error", message: "Ошибка запроса" };
handleError(res1); // Ничего не выводит
handleError(res2); // Выведет: "Ошибка: Ошибка запроса"
Что здесь происходит?
Extract<ApiResponse, { status: "error" }> оставляет только те объекты, у которых status: "error".Это более реальный кейс, так как обработка API-ответов — частая задача во фронтенд-разработке. 🚀
| Утилита | Описание |
|---|---|
Exclude<T, U> | Исключает все подтипы из T, которые совместимы с U |
Extract<T, U> | Оставляет только подтипы из T, которые совместимы с U |
Пример:
type Mixed = string | number | boolean;
type OnlyStrings = Exclude<Mixed, number | boolean>;
// string
type OnlyNumbersOrBooleans = Extract<Mixed, number | boolean>;
// number | boolean