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 и т.д. для более тонкой настройки и фильтрации типов.