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