Какие встроенные Utility Types есть в TypeScript?

MiddleTypeScript #typescript #utility-types

Вопрос

Какие полезные встроенные Utility Types есть в TypeScript и когда их применять?

Короткий ответ

Utility Types — это встроенные дженерик-типы, которые трансформируют уже существующие типы: делают поля опциональными, выбирают подмножество, меняют ключи и т.д. Это позволяет не дублировать интерфейсы вручную.

Подробный ответ

Самые используемые:

  • Partial<T> — все поля становятся опциональными. Удобно для объектов обновления (PATCH).
  • Required<T> — обратное: все поля обязательны.
  • Pick<T, K> — оставляет только указанные поля K.
  • Omit<T, K> — исключает указанные поля.
  • Record<K, V> — объект-словарь с ключами K и значениями V.
  • Readonly<T> — запрещает переприсваивание полей.
  • ReturnType<F> — извлекает тип возвращаемого значения функции.

Пример

interface User {
  id: number
  name: string
  email: string
  password: string
}

// Для формы обновления профиля пароль и id не нужны
type UpdateUserDto = Partial<Omit<User, 'id' | 'password'>>

function updateUser(id: number, dto: UpdateUserDto) { /* ... */ }
updateUser(1, { name: 'Новое имя' }) // остальные поля не обязательны

// Словарь ролей
type RolePermissions = Record<'admin' | 'editor' | 'viewer', string[]>

const permissions: RolePermissions = {
  admin: ['read', 'write', 'delete'],
  editor: ['read', 'write'],
  viewer: ['read']
}

Дополнительные вопросы

  • Как реализовать Partial<T> самостоятельно через mapped types?
  • Чем Pick/Omit отличаются от деструктуризации на уровне значений?
  • Что такое условные типы (T extends U ? X : Y)?