Модульні уроки (2/2)
Типи утиліт
TypeScript надає кілька глобальних типів утиліт для полегшення загальних перетворень типів. Ці типи є загальними і дозволяють вам декларативно створювати нові типи з існуючих.
Чотири найбільш часто використовувані типи утиліт:
1. Partial<T>
Робить усі властивості типу T необов’язковими. Це надзвичайно корисно для функцій оновлення/виправлення, де абонент може надати лише підмножину полів:
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 лише для читання. Будь-яка спроба перепризначити властивість викличе помилку компілятора під час компіляції:
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 property3. Pick<T, Keys>
Створює тип, вибираючи лише певний набір ключів (представлений об’єднанням рядків) із типу T:
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:
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. Це надзвичайно корисно для зіставлення ключів зі значеннями, що представляють словники або хеш-таблиці (карти ключ-значення):
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: часткове оновлення профілю
Виконайте функцію updateProfile, яка приймає оригінальний профіль (Профіль) і об’єкт оновлення (оновлення), де всі поля профілю є необов’язковими. Він повинен повернути новий об’єкт Profile, який поєднує вихідні властивості з оновленнями.
Показати підказку
Використовуйте тип утиліти Partial<Profile> для параметра updates і оператор spread для об’єднання об’єктів: { ...original, ...updates }.
Рішення доступне після 3 спроб
Вправа 2: Видалення чутливих полів із пропуском
Враховуючи тип UserAccount, визначте псевдонім типу SafeUser, який пропускає конфіденційну властивість passwordHash.
Показати підказку
Використовуйте тип SafeUser = Omit<UserAccount, 'passwordHash'>; щоб опустити вказане поле.
Рішення доступне після 3 спроб
Вправа 3: публічна конфігурація з вибором і лише для читання
Враховуючи тип AppConfig, визначте псевдонім типу під назвою PublicConfig, який є версією лише для читання (лише для читання), яка містить лише apiEndpoint і властивості порту, вибрані за допомогою Pick.
Показати підказку
Використовуйте тип PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'порт'>>;
Рішення доступне після 3 спроб
Вправа 4: Реєстр користувачів із записом і лише для читання
Маючи інтерфейс користувача з полями id: number і name: string, створіть тип ReadOnlyUser, який робить усі поля в User тільки для читання. Потім створіть тип UserRegistry, який представлятиме словник, де ключ — рядок (наприклад, ідентифікатор рядка), а значення — ReadOnlyUser.
Показати підказку
Використовуйте Readonly<User>, щоб визначити ReadOnlyUser, і Record<string, ReadOnlyUser> для реєстру.
Рішення доступне після 3 спроб