Пошук уроків, статей та іншого контенту
Partial, Required, Pick, Omit, Record — трансформація вже існуючих типів без ручного дублювання полів.
Часто потрібен тип, що майже повністю збігається з уже описаним, але з невеликою відмінністю — наприклад, той самий User, але з усіма полями необов'язковими (для форми часткового оновлення). Переписувати весь тип вручну вдруге дублює визначення й розсинхронізується з оригіналом при зміні. Utility Types — вбудовані генеричні типи TypeScript, що трансформують уже існуючий тип автоматично.
interface User {
id: string;
name: string;
email: string;
}
function updateUser(id: string, changes: Partial<User>): void {
// changes може містити будь-яку підмножину полів User, усі необов'язкові
}
updateUser("1", { name: "Нове ім'я" }); // ок, лише одне полеinterface Config {
apiUrl?: string;
timeout?: number;
}
function start(config: Required<Config>): void {
// тут apiUrl і timeout гарантовано присутні, попри необов'язковість у вихідному Config
}type UserPreview = Pick<User, "id" | "name">; // { id: string; name: string }
type UserWithoutEmail = Omit<User, "email">; // усі поля User, КРІМ emailPick корисний, коли потрібна лише невелика підмножина полів (наприклад, для картки в списку — не весь профіль); Omit — коли зручніше сказати «усе, окрім цього», ніж перелічувати решту вручну.
type StatusLabels = Record<"active" | "inactive" | "banned", string>;
const labels: StatusLabels = {
active: "Активний",
inactive: "Неактивний",
banned: "Заблокований",
// відсутність будь-якого з трьох ключів — помилка компіляції
};function createUser() {
return { id: "1", name: "Тарас", createdAt: new Date() };
}
type NewUser = ReturnType<typeof createUser>; // тип виведено з функції, без ручного дублюванняПрактична цінність Utility Types — не в самому синтаксисі, а в тому, що похідний тип автоматично лишається синхронізованим з оригіналом: додайте нове поле в User, і Partial<User>, Pick<User, ...> тощо оновляться самі, без ручного редагування кожного похідного типу окремо.
Ручне дублювання майже ідентичного типу замість Partial/Pick/Omit — похідний тип розсинхронізується з оригіналом при першій же зміні одного з них і забутому оновленні іншого.
Плутати Pick і Omit за напрямом — Pick перелічує поля, які лишаються, Omit — поля, які виключаються; переплутаний напрямок дає протилежний від очікуваного результат.
Використовувати Record із дуже широким типом ключа (Record<string, T>) там, де насправді відомий конкретний, обмежений набір ключів (літеральний union) — втрачається перевірка, що всі очікувані ключі справді присутні.
Utility Types (Partial, Required, Pick, Omit, Record, ReturnType та інші) трансформують уже існуючий тип у похідний, автоматично синхронізований з оригіналом, — уникаючи ручного дублювання майже ідентичних визначень типів і розсинхронізації між ними при змінах.