- Основное разделение и категоризация
- Мнемонические правила для запоминания
- Подробные таблицы утилитных типов
- Визуальная шпаргалка
- Особенности и правила применения
- Простой пример для закрепления
- Вложенность утилитных типов
- Ключевые ассоциации и практический подход к запоминанию
- Заключительные советы
Для удобства запоминания и использования, все утилитные типы TypeScript можно разделить на две группы:
Partial<T>
- делает все свойства необязательнымиRequired<T>
- делает все свойства обязательнымиPick<T, K>
- выбирает указанные свойстваOmit<T, K>
- исключает указанные свойства
Exclude<T, U>
- исключает типыExtract<T, U>
- извлекает типы
Первые буквы объектных типов складываются в "PROP":
- Partial
- Required
- Omit
- Pick
- Exclude
- Extract
- Объектные типы изменяют структуру объекта (его свойства)
- Union-типы фильтруют элементы множества (элементы union-типа)
Утилитный тип | Описание | Пример |
---|---|---|
Partial<T> |
Делает все свойства необязательными | Partial<User> → { id?: number; name?: string; } |
Required<T> |
Делает все свойства обязательными | Required<User> → { id: number; name: string; } |
Pick<T, K> |
Выбирает указанные свойства | Pick<User, 'id'> → { id: number; } |
Omit<T, K> |
Исключает указанные свойства | Omit<User, 'id'> → { name: string; } |
Утилитный тип | Описание | Пример |
---|---|---|
Exclude<T, U> |
Исключает типы из T, присутствующие в U | Exclude<'a' | 'b' | 'c', 'a'> → 'b' | 'c' |
Extract<T, U> |
Извлекает из T типы, присутствующие в U | Extract<'a' | 'b' | 'c', 'a' | 'b'> → 'a' | 'b' |
ОБЪЕКТНЫЕ ТИПЫ (PROP) | UNION ТИПЫ (EE)
-------------------------------|------------------
Partial<T> → { prop?: value } | Exclude<T, U> → T - U
Required<T> → { prop: value } | Extract<T, U> → T ∩ U
Omit<T, K> → { без K } |
Pick<T, K> → { только K } |
┌─── Объектные типы ────┐ ┌─── Union типы ────┐
│ │ │ │
│ Partial (все?) │ │ Exclude (убрать) │
│ Required (все!) │ │ Extract (взять) │
│ Pick (взять) │ │ │
│ Omit (убрать) │ │ │
└───────────────────────┘ └────────────────────┘
- Основное действие: изменяют структуру объекта, его свойства
- Мнемоника: "PROP" (Partial, Required, Omit, Pick)
- Применение к union-типам:
- Распространяются на каждый член union-типа отдельно
Pick
иOmit
требуют, чтобы выбираемые/исключаемые свойства присутствовали во всех типах union
- Основное действие: фильтруют элементы множества (union-типа)
- Мнемоника: "EE" (Exclude, Extract)
- Математическая аналогия:
Exclude<T, U>
→ T − U (разность множеств)Extract<T, U>
→ T ∩ U (пересечение множеств)
// ОБЪЕКТНЫЕ ТИПЫ
interface User {
id: number;
name: string;
email?: string;
}
// Работаем со СТРУКТУРОЙ объекта:
type OptionalUser = Partial<User>; // все поля необязательные
type RequiredUser = Required<User>; // все поля обязательные
type UserBasic = Pick<User, 'id' | 'name'>; // только id и name
type UserNoId = Omit<User, 'id'>; // без поля id
// UNION ТИПЫ
type Colors = 'red' | 'green' | 'blue' | 'yellow';
type Primary = 'red' | 'green' | 'blue';
// Работаем с МНОЖЕСТВАМИ значений:
type Secondary = Exclude<Colors, Primary>; // 'yellow'
type OnlyPrimary = Extract<Colors, Primary>; // 'red' | 'green' | 'blue'
Утилитные типы можно комбинировать друг с другом для создания сложных трансформаций:
// Выбираем только name и email, делая их обязательными
type UserContactInfo = Required<Pick<User, 'name' | 'email'>>;
// Делаем все поля необязательными, кроме id
type UpdateUser = Partial<Omit<User, 'id'>> & Pick<User, 'id'>;
- Порядок выполнения: изнутри наружу
- Читаемость: внутренний тип применяется первым, результат передается внешнему
- Дистрибутивность:
T<A | B>
часто равноT<A> | T<B>
Тип трансформации | Для объектов | Для union-типов |
---|---|---|
Делает необязательным | Partial |
- |
Делает обязательным | Required |
- |
Выбирает/извлекает | Pick |
Extract |
Исключает/убирает | Omit |
Exclude |
- На практике: начинайте с простых трансформаций, постепенно переходя к вложенным
- Для глубокого понимания: экспериментируйте в TypeScript Playground
- Разбор типов: используйте функцию
type TestType = ...
для промежуточной проверки результатов трансформации - Индикатор понимания: если вы можете предсказать результат вложенных типов вроде
Required<Omit<Partial<T>, K>>
, значит вы хорошо освоили тему
Запомните: объектные типы меняют структуру (PROP), а union-типы фильтруют значения (EE).
Правильное использование утилитных типов делает код более типобезопасным, выразительным и уменьшает дублирование определений типов в проекте.