Literal Types ermöglichen es, die möglichen Werte einer Variablen nur auf bestimmte feste Konstanten zu beschränken, anstatt auf einen allgemeinen Typ (zum Beispiel nicht einfach eine Zahl, sondern die Zahl 5 oder der String "yes").
Dies ist nützlich zur Erstellung von APIs mit festen Parametern, Status usw.
type Direction = 'left' | 'right' | 'up' | 'down'; function move(dir: Direction) { // ... } move('left'); // OK move('top'); // Kompilierungsfehler!
Es funktioniert auch mit Zahlen, Boolean und sogar vollständigen Strukturen (Tuple Literal Type):
type WeekDay = 1 | 2 | 3 | 4 | 5 | 6 | 7; const day: WeekDay = 6; // OK
const d = 'left'; // hat den Typ 'left' (Literal) let e = 'left'; // hat den Typ string (normal)
Frage: Welchen Typ erhält die Variable, wenn sie als const x = "yes"; definiert wird — und kann man dann einen anderen String-Wert zuweisen?
Antwort:
const x = "yes"; deklariert wird, hat x den Typ "yes" (Literal Type), und man kann ihr keinen anderen Wert außer 'yes' zuweisen (und sie kann überhaupt nicht geändert werden, weil const).let x = "yes"; deklariert wird, wird x als string typisiert, und man kann beliebige Strings zuweisen.const x = 'yes'; // x: 'yes' let y = 'yes'; // y: string
Geschichte
In einem Projekt für Aufgabenstatus wurde ein enum verwendet, aber der Entwickler ersetzte ihn durch einen String. Infolgedessen begann die API, beliebige Strings als Status zu akzeptieren, was bei der Weiterentwicklung des Produkts auf Produktionsebene viele Bugs verursachte, da die Kontrolle verloren ging.
Geschichte
Der Entwickler versuchte, Literal Types zur Validierung von Daten zu verwenden, wies aber Parameter aus dem Eingabefeld direkt zu — TS ließ dies zu, da der Typ des Eingabefeldes string war und nicht literal (zum Beispiel "ok" | "fail"), da die Eingabewerte nicht überprüft wurden. Infolgedessen traten zur Laufzeit Werte auf, die nicht aus der Menge der zulässigen stammten.
Geschichte
Während des Schreibens von Tests für eine Funktion, die literale Werte akzeptierte, reichte ein automatisch generierter Test zufällig einen unerwarteten String-Parameter ein, die Tests fielen durch. Später stellte sich heraus, dass die Typisierung aufgrund von Unachtsamkeit bei der Typausgabe bei let-Deklarationen geschwächt war, was der Compiler nicht erfasst hatte.