#13 - Conditional Types та утиліти Partial, Required, Readonly, Pick, Omit

В цьому уроці поговоримо про 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 виключено, а всі інші поля необов’язкові. Корисно, наприклад, для форм введення нових користувачів.

На цьому мабуть все, але ми ще поврнемося до більш складних прикладів з утилітами в наступних уроках