ProgrammierungFrontend Entwickler

Wie funktioniert die Typisierung von konstanten Objekten mit der Eigenschaft as const? Welche Vorteile und welche Probleme können bei falscher Typisierung solcher Objekte auftreten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

as const in TypeScript macht Werte und Eigenschaften von Objekten/Arrays zu readonly und literal Typen. Dies ermöglicht eine strenge Typisierung: die Werte "erweitern" sich nicht auf den Basistyp, sondern behalten ihren spezifischen Wert.

Beispiel:

const a = { status: 'success' }; // Typ: { status: string } const b = { status: 'success' } as const; // Typ: { readonly status: "success" }

Vorteile:

  • Strenge Typisierung (z.B. switch/case bei Strings, Konstantenlisten)
  • Ideal für enums, actionTypes in Redux, Rollenlisten usw.
  • Verhindert versehentliche Wertänderungen

Nachteile/Eigenschaften:

  • Eigenschaften werden zu readonly, ein Versuch, sie zu ändern, führt zu einem Fehler.
  • Unvorsichtige Verwendung kann zu Typinkompatibilität führen (z.B. wenn ein String benötigt wird, aber ein Literal übergeben wurde).

Fangfrage

Frage: Wenn man as const für ein Array von Strings verwendet, welchen Typ hat es und kann es als normales string[] übergeben werden?

Antwort: Der Typ wird readonly ["a", "b", "c"] sein, also ein Tupel aus Literaltypen mit readonly-Einschränkung. Dieses Array ist inkompatibel mit dem Typ string[]; es kann nicht direkt dort übergeben werden, wo ein veränderbares String-Array erwartet wird.

const arr = ['a', 'b', 'c'] as const; // readonly ["a", "b", "c"] function acceptsStrings(x: string[]) {} acceptsStrings(arr); // Fehler! Typ inkompatibel

Beispiele realer Fehler aufgrund fehlender Kenntnisse zu den Feinheiten des Themas


Geschichte

Projekt: Hatte eine Liste von actionTypes als konstantes Array mit as const gespeichert und versuchte dann, es in einer Funktion zu übergeben, die string[] erwartet. Bekamen einen Typfehler, mussten es mit .slice() oder [...arr] explizit umwandeln.


Geschichte

Projekt: Im Redux-Mikroframework wurde der Typ action.type als Literal über as const definiert. Bei der Implementierung von switch-case wurde die strenge Typisierung vergessen, nicht alle möglichen Literale wurden behandelt, weshalb die exhaustive Prüfung nicht funktionierte — ein Fehler trat erst auf, als ein neuer Action hinzugefügt wurde.


Geschichte

Projekt: Bei der automatischen Generierung von API-Endpunkten wurden deren Schlüssel über ein as const-Array beschrieben. Der Versuch, diese Schlüssel als Index eines normalen Record<string, ...> zu verwenden, schlug aufgrund von Typinkonsistenzen fehl — es war notwendig, eine Umwandlung hinzuzufügen oder die Schlüsseltypen aus dem Array explizit zu verwenden.