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

Какие утилиты чаще всего используешь в TypeScript?

2.0 Middle🔥 241 комментариев
#TypeScript

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

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

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

Утилиты TypeScript: часто используемые типы и инструменты

Встроенные Utility Types

TypeScript предоставляет мощный набор встроенных утилит для трансформации типов. Вот самые полезные:

1. Partial<T> — сделать все поля опциональными

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

// Все поля становятся опциональными
type PartialUser = Partial<User>;
// { id?: number; name?: string; email?: string; }

// Практическое применение:
function updateUser(id: number, updates: Partial<User>) {
  // Можно передать не все поля
}
updateUser(1, { name: "John" }); // OK

2. Required<T> — наоборот, все обязательные

type RequiredUser = Required<PartialUser>;
// Все ? убираются, все поля обязательны

3. Readonly<T> — сделать поля read-only

type ReadonlyUser = Readonly<User>;
// user.name = "Jane"; // ❌ Error

// Или для одного поля:
interface Config {
  readonly apiKey: string;
  port: number;
}

4. Pick<T, K> — выбрать только нужные поля

// Только id и name
type UserPreview = Pick<User, "id" | "name">;
// { id: number; name: string; }

// Полезно для API ответов:
function getUser(): Pick<User, "id" | "name"> {
  return { id: 1, name: "John" };
}

5. Omit<T, K> — исключить ненужные поля

// Все кроме email
type UserWithoutEmail = Omit<User, "email">;
// { id: number; name: string; }

// Практическое применение:
function createUser(data: Omit<User, "id">) {
  // id будет сгенерирован автоматически
}

6. Record<K, T> — создать объект с известными ключами

type Role = "admin" | "user" | "guest";
type Permissions = Record<Role, string[]>;

const permissions: Permissions = {
  admin: ["read", "write", "delete"],
  user: ["read", "write"],
  guest: ["read"],
};

7. Exclude<T, U> и Extract<T, U> — для union типов

type Status = "success" | "error" | "loading" | "idle";

// Исключить loading и idle
type ActiveStatus = Exclude<Status, "loading" | "idle">;
// "success" | "error"

// Выбрать только terminal states
type TerminalStatus = Extract<Status, "success" | "error">;
// "success" | "error"

8. ReturnType<T> — тип возвращаемого значения функции

function getUser(): { id: number; name: string } {
  return { id: 1, name: "John" };
}

type UserType = ReturnType<typeof getUser>;
// { id: number; name: string; }

9. Parameters<T> — типы параметров функции

function process(id: number, data: string) {}

type Params = Parameters<typeof process>;
// [id: number, data: string]

Custom Utility Types

Часто создаю собственные утилиты для специфических задач:

// Глубокий Partial
type DeepPartial<T> = {
  [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};

// Ключи только с определённым типом значения
type KeysOfType<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never;
}[keyof T];

interface User {
  id: number;
  name: string;
  active: boolean;
}

type StringKeys = KeysOfType<User, string>; // "name"
type NumberKeys = KeysOfType<User, number>; // "id"

Инструменты в Node.js Backend разработке

1. Utility Type для API ответов

type ApiResponse<T> = {
  data: T;
  status: number;
  message: string;
};

type UserResponse = ApiResponse<User>;

2. Conditional Types

type IsString<T> = T extends string ? true : false;
type A = IsString<"hello">; // true
type B = IsString<number>;  // false

3. Mapped Types для автоматизации

// Автоматически создать getters для всех полей
type Getters<T> = {
  [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};

type UserGetters = Getters<User>;
// {
//   getId: () => number;
//   getName: () => string;
//   getEmail: () => string;
// }

Практический пример из Backend разработки

// Базовый тип
interface DbUser {
  id: string;
  email: string;
  password: string;
  createdAt: Date;
}

// Для API ответа (без пароля)
type ApiUser = Omit<DbUser, "password">;

// Для создания пользователя
type CreateUserInput = Omit<DbUser, "id" | "createdAt">;

// Для обновления (всё опционально)
type UpdateUserInput = Partial<CreateUserInput>;

// Для фильтров/поиска
type UserFilters = Partial<Pick<DbUser, "email">>;

Заключение

Регулярно используемые в backend разработке: Partial, Omit, Pick, Record, ReturnType, Parameters. Это значительно снижает дублирование кода и улучшает type safety. Понимание этих утилит — ключевой скилл для профессионального TypeScript разработчика.