В цьому уроці поговоримо про Conditional Types (Умовні типи), та утиліти трансформації - Partial, Required, Readonly, Pick, Omit.
Умовні типи (Conditional Types)
Умовні типи дозволяють створювати типи на основі певних умов, наприклад:
T extends U ? X : Y
Це означає: якщо тип T є підтипом U, тоді результат — тип X, інакше — тип Y. Як це можна використати:
type IsString<T> = T extends string ? "yes" : "no";
type A = IsString<string>; // "yes"
type B = IsString<number>; // "no"
По факту це основа для побудови більш складних типів.
Partial<T>
Робить усі властивості типу T необов’язковими.
type User = {
id: number;
name: string;
};
type PartialUser = Partial<User>;
// Еквівалентно:
type PartialUserManual = {
id?: number;
name?: string;
};
Фактичто ця утиліта це спрощенний синтаксис, щоб не писати багато умов.
Required<T>
Як зрозуміло з назви, ця утиліта робить все навпаки. Partial — робить усі властивості обов’язковими.
type User = {
id?: number;
name?: string;
};
type StrictUser = Required<User>;
// Всі поля тепер обов’язкові
Readonly<T>
Думаю, тут теж все зрозуміло з назви. Робить всі властивості readonly.
type User = {
id: number;
name: string;
};
type ReadonlyUser = Readonly<User>;
const user: ReadonlyUser = { id: 1, name: "Ivan" };
user.name = "Petro"; // Помилка!
Pick<T, K>
Створює тип з обраними властивостями типу T. Це може бути корисно, коли вам потрібна лише частина інформації, наприклад для списку користувачів.
type User = {
id: number;
name: string;
email: string;
};
type UserPreview = Pick<User, "id" | "name">;
// Результат: { id: number; name: string; }
Omit<T, K>
Навпаки до Pick — вилучає вказані властивості з типу T.
type User = {
id: number;
name: string;
email: string;
};
type UserWithoutEmail = Omit<User, "email">;
// Результат: { id: number; name: string; }
Комбінування утиліт
Ці утиліти можна комбінувати:
type DraftUser = Partial<Omit<User, "id">>;
Цей тип — об’єкт користувача, у якого id виключено, а всі інші поля необов’язкові. Корисно, наприклад, для форм введення нових користувачів.
На цьому мабуть все, але ми ще поврнемося до більш складних прикладів з утилітами в наступних уроках