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
const d = 'links'; // heeft type 'links' (Literal) let e = 'links'; // heeft type string (gewone)
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:
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).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
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.