Перейти до основного вмісту
Модуль 4 · Урок 2 із 28/14 у курсі~15 min
Модульні уроки (2/2)

Типи утиліт

TypeScript надає кілька глобальних типів утиліт для полегшення загальних перетворень типів. Ці типи є загальними і дозволяють вам декларативно створювати нові типи з існуючих.

Чотири найбільш часто використовувані типи утиліт:

1. Partial<T>

Робить усі властивості типу T необов’язковими. Це надзвичайно корисно для функцій оновлення/виправлення, де абонент може надати лише підмножину полів:

TS
interface User {
  id: number;
  name: string;
  email: string;
}

// All properties of User become optional: { id?: number; name?: string; email?: string; }
type UserUpdate = Partial<User>;

2. Readonly<T>

Робить усі властивості типу T лише для читання. Будь-яка спроба перепризначити властивість викличе помилку компілятора під час компіляції:

TS
interface Point {
  x: number;
  y: number;
}

const p: Readonly<Point> = { x: 10, y: 20 };
// p.x = 5; // Error: cannot assign to 'x' because it is a read-only property

3. Pick<T, Keys>

Створює тип, вибираючи лише певний набір ключів (представлений об’єднанням рядків) із типу T:

TS
interface Article {
  id: number;
  title: string;
  content: string;
  views: number;
}

// Selects only 'title' and 'views': { title: string; views: number; }
type ArticlePreview = Pick<Article, 'title' | 'views'>;

4. Omit<T, Keys>

Створює тип шляхом видалення певного набору ключів із типу T. Це двійник Pick:

TS
interface Product {
  id: number;
  name: string;
  price: number;
  secretVendorCode: string;
}

// Removes 'secretVendorCode': { id: number; name: string; price: number; }
type PublicProduct = Omit<Product, 'secretVendorCode'>;

5. Record<Keys, Type>

Створює тип об’єкта, ключі властивостей якого Keys та значення властивостей Type. Це надзвичайно корисно для зіставлення ключів зі значеннями, що представляють словники або хеш-таблиці (карти ключ-значення):

TS
type Page = 'home' | 'about' | 'contact';

interface PageInfo {
  title: string;
}

// Creates a dictionary with keys 'home' | 'about' | 'contact' and values PageInfo
const nav: Record<Page, PageInfo> = {
  home: { title: 'Home Page' },
  about: { title: 'About Us' },
  contact: { title: 'Contact Us' },
};

Спробуйте самі

Вправа 1: часткове оновлення профілю

вправи#ts.m4.l2.e1
Спроби: 0Завантаження…

Виконайте функцію updateProfile, яка приймає оригінальний профіль (Профіль) і об’єкт оновлення (оновлення), де всі поля профілю є необов’язковими. Він повинен повернути новий об’єкт Profile, який поєднує вихідні властивості з оновленнями.

Завантаження редактора…
Показати підказку

Використовуйте тип утиліти Partial<Profile> для параметра updates і оператор spread для об’єднання об’єктів: { ...original, ...updates }.

Рішення доступне після 3 спроб

Вправа 2: Видалення чутливих полів із пропуском

вправи#ts.m4.l2.e2
Спроби: 0Завантаження…

Враховуючи тип UserAccount, визначте псевдонім типу SafeUser, який пропускає конфіденційну властивість passwordHash.

Завантаження редактора…
Показати підказку

Використовуйте тип SafeUser = Omit<UserAccount, 'passwordHash'>; щоб опустити вказане поле.

Рішення доступне після 3 спроб

Вправа 3: публічна конфігурація з вибором і лише для читання

вправи#ts.m4.l2.e3
Спроби: 0Завантаження…

Враховуючи тип AppConfig, визначте псевдонім типу під назвою PublicConfig, який є версією лише для читання (лише для читання), яка містить лише apiEndpoint і властивості порту, вибрані за допомогою Pick.

Завантаження редактора…
Показати підказку

Використовуйте тип PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'порт'>>;

Рішення доступне після 3 спроб

Вправа 4: Реєстр користувачів із записом і лише для читання

вправи#ts.m4.l2.e4
Спроби: 0Завантаження…

Маючи інтерфейс користувача з полями id: number і name: string, створіть тип ReadOnlyUser, який робить усі поля в User тільки для читання. Потім створіть тип UserRegistry, який представлятиме словник, де ключ — рядок (наприклад, ідентифікатор рядка), а значення — ReadOnlyUser.

Завантаження редактора…
Показати підказку

Використовуйте Readonly<User>, щоб визначити ReadOnlyUser, і Record<string, ReadOnlyUser> для реєстру.

Рішення доступне після 3 спроб