Modulelessen (2/2)
Soorten nutsvoorzieningen
TypeScript biedt verschillende globale hulpprogrammatypen om algemene typetransformaties te vergemakkelijken. Deze typen zijn generiek en stellen u in staat declaratief nieuwe typen op te bouwen op basis van bestaande typen.
De vier meest gebruikte typen nutsvoorzieningen zijn:
1. Partial<T>
Maakt alle eigenschappen van het type T optioneel. Dit is uiterst handig voor update-/patchfuncties waarbij de beller mogelijk slechts een subset van velden opgeeft:
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>
Maakt alle eigenschappen van het type T alleen-lezen. Elke poging om een eigenschap opnieuw toe te wijzen zal een compilatiefout tijdens het compileren veroorzaken:
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>
Creëert een type door alleen een specifieke set sleutels te selecteren (weergegeven door een tekenreeksvereniging) van het type 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>
Creëert een type door een specifieke set sleutels van het type T te verwijderen. Het is de duale van 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>
Creëert een objecttype waarvan de eigenschapssleutels Keys zijn en waarvan de eigenschapswaarden Type zijn. Het is uiterst handig voor het toewijzen van sleutels aan waarden, die woordenboeken of hashtabellen vertegenwoordigen (sleutel-waarde-kaarten):
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' },
};Probeer het zelf
Oefening 1: Profielupdate met gedeeltelijke
Voltooi de updateProfile-functie die een origineel profiel (Profile) en een updates-object (updates) accepteert, waarbij alle velden van Profile optioneel zijn. Het moet een nieuw profielobject retourneren dat de oorspronkelijke eigenschappen combineert met de updates.
Toon hint
Gebruik het hulpprogramma Partial<Profile> voor de parameter updates en de spread-operator om de objecten samen te voegen: { ...original, ...updates }.
Oplossing beschikbaar na 3 pogingen
Oefening 2: Gevoelige velden verwijderen met Omit
Definieer, gegeven het type UserAccount, een typealias met de naam SafeUser, waarbij de gevoelige eigenschap wachtwoordHash wordt weggelaten.
Toon hint
Gebruikstype SafeUser = Weglaten<UserAccount, 'passwordHash'>; om het opgegeven veld weg te laten.
Oplossing beschikbaar na 3 pogingen
Oefening 3: Openbare configuratie met Pick en Readonly
Gegeven het AppConfig-type definieert u een typealias met de naam PublicConfig. Dit is een alleen-lezen-versie (alleen-lezen) die alleen de apiEndpoint- en poorteigenschappen bevat die zijn geselecteerd met Pick.
Toon hint
Gebruik type PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'poort'>>;
Oplossing beschikbaar na 3 pogingen
Oefening 4: Gebruikersregister met Record en Readonly
Gegeven een gebruikersinterface met velden id: nummer en naam: string, maak een type ReadOnlyUser dat alle velden in Gebruiker alleen-lezen maakt. Maak vervolgens een type UserRegistry dat een woordenboek vertegenwoordigt, waarbij de sleutel een tekenreeks is (bijvoorbeeld tekenreeks-ID) en de waarde een ReadOnlyUser is.
Toon hint
Gebruik Readonly<User> om ReadOnlyUser te definiëren, en Record<string, ReadOnlyUser> voor het register.
Oplossing beschikbaar na 3 pogingen