← Назад к вопросам

Какие знаешь базовые утилитарные типы?

2.0 Middle🔥 162 комментариев
#JavaScript Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Базовые утилитарные типы в TypeScript

Утилитарные типы (Utility Types) в TypeScript представляют собой инструменты для трансформации или манипуляции существующих типов. Они позволяют создавать новые типы на основе существующих, что значительно повышает эффективность разработки и обеспечивает гибкость системы типов. Вот ключевые утилитарные типы, которые я использую регулярно:

Основные утилитарные типы

1. Partial<T>

Создает тип со всеми свойствами исходного типа T, но каждое свойство становится необязательным (опциональным).

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

const updateUser = (user: Partial<User>) => {
  // Можно передать только некоторые свойства
};

updateUser({ name: 'Иван' }); // OK - email и id не обязательны

2. Required<T>

Делает все свойства типа T обязательными, противоположность Partial.

type PartialUser = Partial<User>;
type RequiredUser = Required<PartialUser>; // Все свойства теперь обязательны

3. Readonly<T>

Создает тип, где все свойства становятся только для чтения (readonly).

const user: Readonly<User> = { id: 1, name: 'Анна', email: 'anna@mail.com' };
user.name = 'Мария'; // Ошибка: свойство readonly

4. Record<K, T>

Создает тип-объект с ключами типа K и значениями типа T. Особенно полезен для создания словарей или карт.

type PageViews = Record<string, number>;
const views: PageViews = {
  '/home': 1000,
  '/about': 500,
};

5. Pick<T, K>

Выбирает из типа T только указанные свойства K (которые должны быть ключами T).

type UserNameOnly = Pick<User, 'name'>;
const nameOnly: UserNameOnly = { name: 'Петр' };

6. Omit<T, K>

Удаляет указанные свойства K из типа T, оставляя остальные.

type UserWithoutEmail = Omit<User, 'email'>;
const noEmail: UserWithoutEmail = { id: 1, name: 'Ольга' };

7. Exclude<T, U>

Удаляет из типа T все элементы, которые присутствуют в типе U. Работает с объединениями типов (union types).

type AllColors = 'red' | 'green' | 'blue';
type PrimaryColors = Exclude<AllColors, 'blue'>; // 'red' | 'green'

8. Extract<T, U>

Выбирает из типа T только элементы, которые присутствуют в типе U.

type Mixed = string | number | boolean;
type OnlyNumbers = Extract<Mixed, number>; // number

9. NonNullable<T>

Удаляет из типа T значения null и undefined.

type MaybeString = string | null | undefined;
type DefinitelyString = NonNullable<MaybeString>; // string

Полезные утилитарные типы для функций

10. ReturnType<T>

Получает тип возвращаемого значения функции T.

function getUser(id: number): User {
  return { id, name: 'Сергей', email: 'sergey@mail.com' };
}

type UserReturn = ReturnType<typeof getUser>; // User

11. Parameters<T>

Получает типы параметров функции T в виде массива типов.

type GetUserParams = Parameters<typeof getUser>; // [number]

12. ConstructorParameters<T>

Получает типы параметров конструктора класса T.

class Car {
  constructor(model: string, year: number) {}
}
type CarParams = ConstructorParameters<typeof Car>; // [string, number]

Дополнительные важные утилитарные типы

13. InstanceType<T>

Получает тип экземпляра класса T.

type CarInstance = InstanceType<typeof Car>; // Car

14. Awaited<T>

Получает тип результата после разрешения Promise (работает с async функциями и Promise).

async function fetchData(): Promise<User[]> {
  return [];
}
type FetchedData = Awaited<ReturnType<typeof fetchData>>; // User[]

Практическое применение

Утилитарные типы применяются в различных сценариях:

  • Создание гибких API – использование Partial для функций обновления
  • Обеспечение безопасности данныхReadonly для конфигураций
  • Рефакторинг типовPick и Omit для выделения повторяющихся структур
  • Манипуляции с функциямиParameters и ReturnType для создания универсальных хуков
  • Работа с динамическими объектамиRecord для коллекций данных

Пример комбинации утилитарных типов

// Создаем тип только для чтения с некоторыми свойствами
interface Product {
  id: number;
  name: string;
  price: number;
  description: string;
}

type ReadonlyProductSummary = Readonly<Pick<Product, 'id' | 'name' | 'price'>>;

Утилитарные типы делают TypeScript значительно более мощным инструментом для создания сложных, но безопасных систем типов, уменьшая дублирование кода и повышая выразительность типизации. Они являются фундаментальной частью профессиональной разработки на TypeScript и используются ежедневно в реальных проектах.

Какие знаешь базовые утилитарные типы? | PrepBro