Весной стартует сезон найма, успей отхватить свой оффер!

Utility Type Exclude в TypeScript

Exclude — это utility тип в TypeScript, который позволяет исключать определённые подтипы из union-типа. Он создаёт новое объединение, убирая те члены, которые можно присвоить какому-то другому типу.


Синтаксис

Exclude<T, U>
  • T — исходный union-тип.
  • U — подтипы (или union подтипов), которые нужно убрать из T.

Таким образом, Exclude<T, U> удаляет из T все подтипы, которые можно присвоить U, оставляя только несовместимые.


Когда использовать Exclude?

  1. Очистка типов: удаление null и undefined, чтобы избежать лишних проверок.
  2. Фильтрация опциональных полей: когда нужно оставить только определённые варианты в union-типе.
  3. Работа с API-данными: исключение нежелательных значений из возможных ответов сервера.
  4. Оптимизация типов: уменьшение количества возможных вариантов для удобства использования.

Примеры

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