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:
Nachteile/Eigenschaften:
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
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.