🏛️Funktionen & Klassen

Wie man Funktionen und Klassen typisiert – und was davon im JavaScript übrig bleibt. Alle Typen und Ausgaben kommen live vom Compiler.

ƒFunktionstypen

Parameter bekommen Typen, der Rückgabetyp wird meist abgeleitet. Bei Callbacks übernimmt TypeScript den Typ aus dem Kontext (contextual typing): plus braucht keine eigenen Annotationen.
TypeScript · Maus über Namennur lesen
Vom Compiler abgeleitet
  • Zeile 2a:…
  • Zeile 3mal:…
  • Zeile 3trenner:…
  • Zeile 9ergebnis:…

🔀Overloads

Mehrere Signaturen für eine Implementierung: Der Aufrufer sieht nur die Overload-Signaturen, der Compiler wählt die erste passende – und damit den genauen Rückgabetyp.
TypeScript · Maus über Namennur lesen
Vom Compiler abgeleitet
  • Zeile 6eins:…
  • Zeile 7viele:…
✅ Tipp
Oft reicht statt Overloads eine Union im Parameter oder ein generischer Typ. Overloads lohnen sich, wenn der Rückgabetyp vom Argumenttyp abhängt.

🏛️Klassen und Zugriffsmodifikatoren

Klassen sind in TypeScript normale JavaScript-Klassen plus Typen. Achten Sie auf die rechte Seite: Was davon gibt es zur Laufzeit wirklich?

Die Modifikatoren prüft nur der Compiler (zwei Fehler in der letzten Zeile). Im JavaScript stehen alle drei Felder ganz normal – private schützt zur Laufzeit nicht.

TypeScript · bearbeitbar, Maus über Namen zeigt Typen
JavaScript (erzeugt von tsc) · …nur lesen

🔢Enums vs. Union von Literalen

Vier Wege zu einer Liste erlaubter Werte – und wie viel JavaScript jeder erzeugt.
enum…

Ein numerisches enum erzeugt ein echtes Objekt – sogar mit Rückwärts-Zuordnung (Richtung[0] === "Hoch"). Das ist Laufzeit-Code, den Node.js' Type Stripping nicht kann.

const enum…

const enum wird beim Kompilieren eingesetzt (1 /* Richtung.Runter */) – kein Objekt zur Laufzeit. Funktioniert aber nicht mit Werkzeugen, die Dateien einzeln übersetzen (isolatedModules).

Union von Literalen…

Der Typ verschwindet vollständig. Werte sind lesbare Strings, Tippfehler meldet der Compiler trotzdem. In modernem TypeScript meist die erste Wahl.

as const-Objekt…

Wer ein Laufzeit-Objekt und einen Typ möchte: as const + abgeleiteter Typ. Nur „löschbare“ Syntax – funktioniert mit erasableSyntaxOnly.

✅satisfies, Annotation oder as?

Drei Arten, einem Objekt einen Typ zu geben – mit sehr unterschiedlichen Folgen für den Typ von config.port.
Annotation : Konfig
Typ von port: …

Die Variable ist jetzt eine Konfig: Geprüft wird zwar, aber das Wissen über die konkreten Werte geht verloren – port ist nur noch string | number.

satisfies Konfig
Typ von port: …

Geprüft wird gegen Konfig, aber der Wert behält seinen eigenen, genauen Typ: port ist number. Das Beste aus beiden Welten (seit TypeScript 4.9).

as Konfig
Typ von port: …

as ist eine Behauptung, keine Prüfung: Der Compiler glaubt uns, obwohl port fehlt. Zur Laufzeit ist port hier undefined – der Typ sagt etwas anderes.

satisfies mit Fehler
Typ von port: …

satisfies meldet den falschen Wert sofort – true ist weder string noch number.

🧊as const

as const macht aus Literalen die engsten Typen: Strings bleiben Literal-Typen, Arrays werden zu schreibgeschützten Tupeln, Objekte zu readonly. Ideal, um aus Daten Typen abzuleiten.
TypeScript · bearbeitbar, Maus über Namen zeigt Typen
JavaScript (erzeugt von tsc) · …nur lesen