Lecții din modul (2/2)
Tipuri de utilitate
TypeScript oferă mai multe tipuri de utilitate globale pentru a facilita transformările comune ale tipurilor. Aceste tipuri sunt generice și vă permit să construiți în mod declarativ noi tipuri din cele existente.
Cele patru tipuri de utilitate cele mai utilizate sunt:
1. Partial<T>
Face ca toate proprietățile de tip T opțional. Acest lucru este extrem de util pentru funcțiile de actualizare/patch în care apelantul poate furniza doar un subset de câmpuri:
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. PROTEJAT_INLINE_2
Face ca toate proprietățile de tip T numai citire. Orice încercare de a reatribui o proprietate va declanșa o eroare de compilare la compilare:
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>
Creează un tip selectând doar un anumit set de chei (reprezentat printr-o uniune de șiruri) din tipul 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>
Creează un tip prin eliminarea unui anumit set de chei din tipul T. Este dubla dintre 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>
Creează un tip de obiect ale cărui chei de proprietate sunt Keys și ale cărui valori de proprietate sunt Type. Este extrem de util pentru maparea cheilor la valori, reprezentând dicționare sau tabele hash (hărți cheie-valoare):
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' },
};Încercați-l singur
Exercițiul 1: Actualizarea profilului cu Partial
Completați funcția updateProfile care acceptă un profil original (Profil) și un obiect de actualizări (actualizări) unde toate câmpurile Profilului sunt opționale. Trebuie să returneze un nou obiect Profil care combină proprietățile originale cu actualizările.
Afișează indiciu
Utilizați tipul de utilitar Parțial<Profil> pentru parametrul de actualizări și operatorul de răspândire pentru a îmbina obiectele: { ...original, ...actualizări }.
Soluție disponibilă după 3 încercări
Exercițiul 2: Eliminarea câmpurilor sensibile cu Omit
Având în vedere tipul UserAccount, definiți un alias de tip numit SafeUser care omite proprietatea sensibilă passwordHash.
Afișează indiciu
Utilizați tipul SafeUser = Omit<UserAccount, 'passwordHash'>; pentru a omite câmpul specificat.
Soluție disponibilă după 3 încercări
Exercițiul 3: Configurare publică cu Pick and Readonly
Având în vedere tipul AppConfig, definiți un alias de tip numit PublicConfig care este o versiune numai în citire (numai în citire) care conține numai proprietățile apiEndpoint și portul selectate folosind Pick.
Afișează indiciu
Utilizați tipul PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'port'>>;
Soluție disponibilă după 3 încercări
Exercițiul 4: Registrul utilizatorilor cu înregistrare și numai citire
Având în vedere o interfață de utilizator cu câmpuri id: număr și nume: șir, creați un tip ReadOnlyUser care face ca toate câmpurile din User doar citire. Apoi, creați un tip UserRegistry care reprezintă un dicționar în care cheia este un șir (de exemplu, șir id) și valoarea este ReadOnlyUser.
Afișează indiciu
Utilizați Readonly<User> pentru a defini ReadOnlyUser și Record<string, ReadOnlyUser> pentru registry.
Soluție disponibilă după 3 încercări