ProgrammatieTypeScript ontwikkelaar

Wat zijn Literal Types in TypeScript en waarvoor worden ze gebruikt? Hoe kunnen ze strikte beperkingen op de waarden van variabelen implementeren en welke valkuilen zijn er bij het gebruik ervan?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Literal Types stellen je in staat om de mogelijke waarden van een variabele te beperken tot specifieke strikte constanten, in plaats van gewoon een algemeen type (bijvoorbeeld niet gewoon een getal, maar het getal 5 of de string "ja").

Dit is nuttig voor het creëren van API's met vaste parameters, statussen, enz.

type Direction = 'links' | 'rechts' | 'omhoog' | 'omlaag'; function move(dir: Direction) { // ... } move('links'); // OK move('boven'); // Compilatiefout!

Ze werken ook met getallen, boolean en zelfs samengestelde structuren (tuple literal type):

type WeekDag = 1 | 2 | 3 | 4 | 5 | 6 | 7; const dag: WeekDag = 6; // OK

Beperkingen en nuances:

  • Waarden kunnen niet impliciet naar literal types worden geconverteerd (bijvoorbeeld, je kunt geen waarde van gebruiker invoer toewijzen aan een variabele van het type 'links' | 'rechts' zonder controle).
  • Bij het werken met constanten en let-variabelen is het belangrijk om het type van uitvoer te onthouden:
const d = 'links'; // heeft type 'links' (Literal) let e = 'links'; // heeft type string (gewone)

Strikvraag

Vraag: Wat voor type krijgt een variabele als je deze definieert als const x = "ja"; — en kan je haar daarna een andere stringwaarde toewijzen?

Antwoord:

  • Als je const x = "ja"; declareert — x zal het type "ja" krijgen (literal type), en je kunt er niet zomaar een andere waarde aan toewijzen, behalve 'ja' (en het kan niet veranderd worden omdat het const is).
  • Als je let x = "ja"; declareert, dan zal x getypeerd worden als string, en kun je elke string toewijzen.
const x = 'ja'; // x: 'ja' let y = 'ja'; // y: string

Voorbeelden van werkelijke fouten door gebrek aan kennis van de subtiele punten van het onderwerp.


Verhaal

In een project voor taakstatussen werd een enum gebruikt, maar de ontwikkelaar verving deze door een string. Als gevolg hiervan begon de API elke string als status te accepteren, wat leidde tot veel bugs tijdens de ontwikkeling van het product in productie, omdat de controle verloren was gegaan.


Verhaal

Een ontwikkelaar probeerde literal types te gebruiken voor gegevensvalidatie, maar wees direct parameters uit het formulier toe — TS staat dit toe, omdat het type van het inputveld string was en geen literal (bijvoorbeeld, "ok" | "fail"), omdat de inputwaarden niet waren gecontroleerd. Uiteindelijk ontstonden er runtime-waarden die niet uit de toegestane verzameling kwamen.


Verhaal

Tijdens het schrijven van tests voor een functie die literal waarden accepteerde, diende een automatisch gegenereerde test per ongeluk een onverwachte stringparameter in, de tests faalden. Later bleek dat de typisering was verzwakt door onoplettendheid met de type-output bij let-declaratie, en de compiler ving dit niet op.