Utility Type Exclude в TypeScript
Exclude — это utility тип в TypeScript, который позволяет исключать определённые подтипы из union-типа. Он создаёт новое объединение, убирая те члены, которые можно присвоить какому-то другому типу.
Синтаксис
Exclude<T, U>
T— исходный union-тип.U— подтипы (или union подтипов), которые нужно убрать изT.
Таким образом, Exclude<T, U> удаляет из T все подтипы, которые можно присвоить U, оставляя только несовместимые.
Когда использовать Exclude?
- Очистка типов: удаление
nullиundefined, чтобы избежать лишних проверок. - Фильтрация опциональных полей: когда нужно оставить только определённые варианты в union-типе.
- Работа с API-данными: исключение нежелательных значений из возможных ответов сервера.
- Оптимизация типов: уменьшение количества возможных вариантов для удобства использования.
Примеры
Пример 1. Исключение типов из объединения
type Mixed = string | number | boolean;
// Убираем числа и булевы значения
type OnlyStrings = Exclude<Mixed, number | boolean>;
// OnlyStrings = string
- У нас есть union-тип
Mixed = string | number | boolean. Exclude<Mixed, number | boolean>оставляет только те типы вMixed, которые не можно присвоитьnumber | boolean.- В результате получается
string.
Пример 2. Исключение null и undefined
type APIResponse = "success" | "error" | null | undefined;
// Убираем null и undefined, оставляя только валидные статусы
type ValidResponse = Exclude<APIResponse, null | undefined>;
function handleResponse(status: ValidResponse) {
console.log(`Received response: ${status}`);
}
handleResponse("success"); // ✅ Ок
handleResponse("error"); // ✅ Ок
handleResponse(null); // ❌ Ошибка компиляции
- Если у нас тип, который включает
nullиundefined, с помощьюExcludeих можно убрать. - Аналог этого подхода — использование утилиты NonNullable.
Отличие от Extract
| Утилита | Описание |
|---|---|
Exclude<T, U> | Исключает все подтипы из T, которые совместимы с U |
Extract<T, U> | Оставляет только подтипы из T, которые совместимы с U |
type Mixed = string | number | boolean;
type OnlyNumbersOrBooleans = Extract<Mixed, number | boolean>;
// number | boolean
type OnlyStrings = Exclude<Mixed, number | boolean>;
// string
Итог
- Exclude упрощает управление сложными union-типами, позволяя исключать ненужные варианты.
- Помогает «очистить» тип, если нужно работать только с определённой группой подтипов.
- Сочетается с утилитами Extract, NonNullable и т.д. для более тонкой настройки и фильтрации типов.