ProgrammatieFrontend ontwikkelaar

Hoe werkt de typing van constante objecten met de eigenschap as const? Wat zijn de voordelen en welke problemen kunnen zich voordoen bij onjuiste typing van dergelijke objecten?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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:

  • Strikte typing (bijvoorbeeld, switch/case op strings, lijsten van constanten)
  • Ideaal voor enums, actionTypes in Redux, lijsten van rollen, enz.
  • Voorkomt per ongeluk wijzigen van waarden

Nadelen/ kenmerken:

  • Eigenschappen worden readonly, een poging om ze te wijzigen zal een fout veroorzaken.
  • Onoplettend gebruik kan leiden tot type-incompatibiliteit (bijvoorbeeld, als een string nodig is, maar je een literale waarde hebt doorgegeven).

Vraag met een val

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

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp


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.