ProgrammierungTypeScript-Entwickler

Was sind Literal Types in TypeScript und wofür werden sie verwendet? Wie kann man mit ihrer Hilfe strenge Einschränkungen für die Werte von Variablen umsetzen und welche Fallstricke gibt es bei ihrer Anwendung?

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

Antwort

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

Einschränkungen und Nuancen:

  • Zu Literal-Typen darf man Werte nicht implizit umwandeln (zum Beispiel kann man einer Variablen mit dem Typ 'left' | 'right' keinen String aus Benutzereingaben ohne Überprüfung zuweisen).
  • Beim Arbeiten mit Konstanten und let-Variablen ist es wichtig, den Typ der Ausgabe im Auge zu behalten:
const d = 'left'; // hat den Typ 'left' (Literal) let e = 'left'; // hat den Typ string (normal)

Fangfrage

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:

  • Wenn 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).
  • Wenn 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

Beispiele für reale Fehler durch Unkenntnis der Feinheiten des Themas.


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.