Direct naar de hoofdinhoud
Module 4 · Les 2 van 28/14 in de cursus~15 min
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:

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>

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:

Code
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>

Creëert een type door alleen een specifieke set sleutels te selecteren (weergegeven door een tekenreeksvereniging) van het type 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>

Creëert een type door een specifieke set sleutels van het type T te verwijderen. Het is de duale van 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>

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):

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' },
};

Probeer het zelf

Oefening 1: Profielupdate met gedeeltelijke

Oefening#ts.m4.l2.e1
Pogingen: 0Laden…

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.

Editor laden…
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

Oefening#ts.m4.l2.e2
Pogingen: 0Laden…

Definieer, gegeven het type UserAccount, een typealias met de naam SafeUser, waarbij de gevoelige eigenschap wachtwoordHash wordt weggelaten.

Editor laden…
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

Oefening#ts.m4.l2.e3
Pogingen: 0Laden…

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.

Editor laden…
Toon hint

Gebruik type PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'poort'>>;

Oplossing beschikbaar na 3 pogingen

Oefening 4: Gebruikersregister met Record en Readonly

Oefening#ts.m4.l2.e4
Pogingen: 0Laden…

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.

Editor laden…
Toon hint

Gebruik Readonly<User> om ReadOnlyUser te definiëren, en Record<string, ReadOnlyUser> voor het register.

Oplossing beschikbaar na 3 pogingen