TypeScript ценят не только за автодополнение, но и за возможность описывать сложную логику на уровне типов. Если базовые string | number уже не впечатляют, пора разбираться с Generics и Utility Types — это то, что делает код гибким, безопасным и удобным в поддержке.
Generics — типы с параметрами
Generics позволяют писать переиспользуемый код без потери типизации.
function identity(value: T): T {
return value;
}
Здесь T — универсальный тип. Функция принимает значение любого типа и возвращает его же без потери информации.
Пример с интерфейсом:
interface ApiResponse {
data: T;
status: number;
}
Теперь можно точно описывать ответ API:
const userResponse: ApiResponse<{ name: string }> = {
data: { name: "Alice" },
status: 200
};
Ограничения generics
Иногда универсальность нужно ограничить:
function getLength(item: T): number {
return item.length;
}
Так TypeScript гарантирует, что у item есть свойство length.
Utility Types — встроенные помощники
Это готовые типы для трансформации существующих структур. Самые полезные:
Partial— делает все поля необязательными
type User = { name: string; age: number };
type PartialUser = Partial;
Удобно для update-операций.
Required— делает все поля обязательными
type FullUser = Required;
Readonly— запрещает изменять свойства
const user: Readonly = { name: "Bob", age: 30 };
Pick— выбирает нужные поля
type UserPreview = Pick;
Omit— исключает поля
type UserWithoutAge = Omit;
Record— создает объект с ключами одного типа и значениями другого
type Roles = Record;
Зачем это нужно на практике 💡
Generics и Utility Types помогают:
- уменьшать дублирование типов
- безопасно описывать ответы API
- делать универсальные компоненты и функции
- упрощать рефакторинг
- ловить ошибки еще до запуска кода
Например, в React generic-компоненты часто используют для таблиц, форм и хуков. А Partial, Pick, Omit особенно полезны в DTO, слоях API и работе с состоянием.
Частая ошибка новичков 🚫
Использовать any там, где нужен generic.any отключает проверку типов, а T сохраняет гибкость и контроль. Если хотите масштабируемый TypeScript-код, лучше выбирать generics, а не уходить в "типовую анархию".
Вывод ✅
Если коротко:
- Generics — для универсальности
- Utility Types — для быстрой трансформации типов
- вместе они делают TypeScript по-настоящему мощным инструментом
Хорошее владение этими возможностями напрямую влияет на качество архитектуры, DX и скорость разработки 🚀
Подписывайтесь на подборку каналов про IT — там еще больше полезного контента для разработчиков, тимлидов и всех, кто следит за индустрией.
- 🗣 Подборки каналов
- 🧠 Каталог ботов и приложений
- 🗺 Навигация