Какие утилиты чаще всего используешь в TypeScript?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Утилиты 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 разработчика.