Modulelessen (2/2)
Letterlijke typen en beweringen
TypeScript biedt geavanceerde tools om de mogelijke waarden van variabelen te beperken en om de compiler te dwingen specifiekere typen te herkennen wanneer dat nodig is.
Letterlijke typen
Een letterlijk type vertegenwoordigt een exacte, enkele waarde (bijvoorbeeld een specifieke tekenreeks of getal). Ze worden meestal gecombineerd met vakbondstypen:
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;
light = 'red'; // OK
light = 'blue'; // Error: "blue" is not assignable to TrafficLightTypeverklaringen (as)
Soms hebt u informatie over een type dat TypeScript tijdens het compileren niet kan weten. In deze gevallen kunt u een typeverklaring gebruiken met het trefwoord as:
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;De bewering vertelt de compiler: "Geloof me, ik weet dat dit element een HTMLCanvasElement is". Er worden tijdens runtime geen controles of casts uitgevoerd; het helpt alleen de typecontrole.
Const-beweringen (as const)
Wanneer we een object of een array declareren met const, staat TypeScript nog steeds toe dat de interne eigenschappen ervan worden gewijzigd. Door aan het einde as const toe te voegen, wordt de hele structuur bevroren en alleen-lezen gemaakt, waarbij alle eigenschappen worden omgezet in hun exacte letterlijke typen:
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Error: array is read-onlyLetterlijke typen van sjablonen
Letterlijke sjabloontypen worden bovenop JavaScript-sjabloontekenreeksen gebouwd, maar worden gebruikt in typeposities. Ze maken het mogelijk om meerdere letterlijke typen in één te combineren:
type Size = 'small' | 'large';
type Color = 'red' | 'blue';
// Creates the union: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;Tekenreekshulpprogramma's in letterlijke sjabloontypen
TypeScript biedt speciale typen hulpprogramma's om tekens binnen letterlijke sjabloontypen te manipuleren:
Capitalize<StringType>: geeft de eerste letter van de tekenreeks een hoofdletter.Uncapitalize<StringType>: Maakt de hoofdletter van de eerste letter van de string ongedaan.Uppercase<StringType>: Converteert de gehele tekenreeks naar hoofdletters.Lowercase<StringType>: Converteert de gehele tekenreeks naar kleine letters.
type ActionType = 'click' | 'hover';
// Generates: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;Probeer het zelf
Oefening 1: Richting Letterlijke Unie
Definieer een letterlijk type met de naam Direction dat alleen de tekenreeksen 'omhoog', 'omlaag', 'links' of 'rechts' accepteert. Declareer vervolgens een functie met de naam move(dir: Direction): string die de string 'Moving' retourneert, gevolgd door de ontvangen richting.
Toon hint
Definieer eerst de typealias met de vier opties gescheiden door |, en declareer vervolgens de move-functie die de parameter en het retourtype annoteert.
Oplossing beschikbaar na 3 pogingen
Oefening 2: Bewering op JSON.parse
De functie JSON.parse retourneert standaard elk type. Wijzig de functie parseUser zodat het resultaat van JSON.parse(json) wordt beweerd als type { gebruikersnaam: string } met behulp van het trefwoord as.
Toon hint
Voeg 'as { gebruikersnaam: string }' toe onmiddellijk na de JSON.parse(json)-aanroep.
Oplossing beschikbaar na 3 pogingen
Oefening 3: Letterlijke sjabloon voor evenementen
Gegeven de status- en actietypen, definieert u een sjabloontekenreekstype met de naam Gebeurtenis in de notatie 'Status-Actie' (bijvoorbeeld 'open-klik').
Toon hint
Gebruik backticks om het type en de syntaxis ${Status}-${Action} daarin te definiëren.
Oplossing beschikbaar na 3 pogingen
Oefening 4: Sjabloonlettertype met hoofdletter
Definieer een letterlijk type Gebeurtenis dat 'klik' of 'zweven' kan zijn. Gebruik vervolgens Template Literal Types om een type EventHandler te declareren dat tekenreeksen vertegenwoordigt in de indeling on, gevolgd door de gebeurtenisnaam met hoofdletters (d.w.z. 'onClick' of 'onHover').
Toon hint
Gebruik Capitalize<Event> letterlijk in de sjabloon om de eerste letter van de gebeurtenis met een hoofdletter te schrijven.
Oplossing beschikbaar na 3 pogingen