as const in TypeScript maakt de waarden en eigenschappen van een object/array readonly en literale types. Dit zorgt voor strikte typing: waarden worden niet "uitgebreid" naar de basis type, maar behouden hun specifieke waarde.
Voorbeeld:
const a = { status: 'success' }; // Type: { status: string } const b = { status: 'success' } as const; // Type: { readonly status: "success" }
Voordelen:
Nadelen/ kenmerken:
Vraag: Wat is het type als je as const gebruikt voor een array van strings, en kun je deze doorgeven als een gewone string[]?
Antwoord: Het type zal readonly ["a", "b", "c"] zijn, dus een tuple van literaal types met readonly-beperkingen. Deze array is incompatibel met het type string[]; je kunt deze niet rechtstreeks doorgeven waar een wijzigbare array van strings wordt verwacht.
const arr = ['a', 'b', 'c'] as const; // readonly ["a", "b", "c"] function acceptsStrings(x: string[]) {} acceptsStrings(arr); // Fout! Type incompatibel
Verhaal
Project: Had een lijst van actionTypes als een constante array met as const, daarna probeerden we deze door te geven aan een functie die string[] verwachtte. We kregen een typefout, we moesten het expliciet converteren met
.slice()of[...arr].
Verhaal
Project: In een Redux-microframework werd het type action.type gedefinieerd als literale via as const. Bij het implementeren van switch-case waren we vergeten over strikte typing, we verwerkten niet alle mogelijke literalen, waardoor de exhaustive check niet werkte — de fout kwam niet aan het licht totdat we een nieuwe actie toevoegden.
Verhaal
Project: Bij het automatisch genereren van API-endpoints beschreven we hun sleutels via een as const-array. De poging om deze sleutels te gebruiken als index voor een gewone Record<string, ...> mislukte vanwege type-incompatibiliteit — we moesten conversie toevoegen of expliciet de types van de sleutels uit de array gebruiken.