Programmiersprache TypeScript 5.0 stellt Decorators neu auf

Neben dem neuen Decorators-Konzept für Methoden, Klassen und Properties bringt das Release konstant typisierte Parameter für bessere Typinferenz.

In Pocket speichern vorlesen Druckansicht 8 Kommentare lesen
Schreibmaschine, Tastatur, Keyboard, Digitalisierung

(Bild: , gemeinfrei)

Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Microsoft hat knapp zwei Monate nach der ersten Beta planmäßig TypeScript 5.0 veröffentlicht. Das stabile Release bringt ein frisches Konzept für Decorators, das auf den Plänen für ECMAScript aufsetzt. Daneben lassen sich Parameter als konstant deklarieren, um die Typinferenz zu verbessern.

TypeScript 5.0 ist keine frische Hauptversion: Das Team verwendet für die Programmiersprache eine Dezimalzählweise und erhöht für jedes Feature-Release die Nachkommastelle um eins. Konsequenterweise folgt TypeScript 5.0 ebenso auf Version 4.9 wie 2020 TypeScript 4.0 auf Version 3.9.

TypeScript kannte Decorators bisher als experimentelle Umsetzung, die das Compiler-Flag --experimentalDecorators erforderte. Decorators sind Funktionen, die für Klassen oder deren Funktionen und Properties aufgerufen werden. Sie können Elemente ersetzen, initialisieren oder erweiterten Zugriff darauf bieten. Das aktuelle Release krempelt die Integration um und setzt dabei auf den aktuellen Stand des zugehörigen ECMAScript-Proposals, also den für JavaScript geplanten Standard zur Decorators.

Ein typisches Beispiel, das sich auch im ECMAScript-Proposal findet, ist das Ersetzen einer Methode durch eine generelle Methode, die bei jedem Aufruf eine Meldung auf der Konsole ausgibt, um Fehler aufzuspüren. Ein Beispiel dafür findet sich im TypeScript-Blog. Folgender Code zeigt die einfache Variante ohne TypeChecking:

function loggedMethod(originalMethod: any, _context: any) {

    function replacementMethod(this: any, ...args: any[]) {
        console.log("LOG: Entering method.")
        const result = originalMethod.call(this, ...args);
        console.log("LOG: Exiting method.")
        return result;
    }

    return replacementMethod;
}

Eine mit @loggedMethod dekorierte Methode nutzt diese Funktion als Ersatz. Sie gibt zunächst "LOG: Entering method." aus, führt dann die ursprüngliche Methode aus (originalMethod.call), um abschließend "LOG: Exiting method." auf die Konsole zu schreiben.

Zumindest übergangsweise wird TypeScript sowohl die neue als auch die alte Implementierung erlauben. Letztere greift, wenn das Compiler-Flag --experimentalDecorators gesetzt ist. Ansonsten gelten die neuen Decorators, die allerdings anders als die alte Umsetzung keine Parameter Decorators erlaubt und die Metadaten nicht über --emitDecoratorMetadata ausgeben können.

Im Vergleich zur Beta hat das Team die Decorators noch um eine Kleinigkeit ergänzt: Ein Dekorateur darf wie im ECMAScript-Proposal entweder vor oder hinter export stehen. Beide Positionen sind erlaubt, dürfen aber nicht gemischt auftreten:

//  vor export ist erlaubt:
@register export default class Foo {
    // ...
}

//  hinter export ist erlaubt:
export default @register class Bar {
    // ...
}

//  vor UND hinter export ist nicht erlaubt:
@before export @after class Bar {
    // ...
}

Eine weitere Ergänzung in TypeScript 5.0 soll die Typinferenz verbessern: Parameter dürfen als konstant deklariert sein. So sorgt das Schlüsselwort const in

type HasNames = { names: readonly string[] };
function getNamesExactly<const T extends HasNames>(arg: T): 
  T["names"] { ... }

dafür, dass TypeScript den Typ exakt und nicht als string[] erkennt. Konstant bezieht sich dabei nur auf den Typ, nicht auf den Wert. Um ihn als unveränderlich zu deklarieren, ist readonly erforderlich.

Daneben gibt es noch einige weitere nennenswerte Neuerungen im aktuellen Release: Konfigurationsdateien für Projekte dürfen ab TypeScript 5.0 auf mehr als eine Grundlage unter extends zurückgreifen, und Enumerations sind neuerdings immer Union Enums statt wie bisher im Zweifel numerische Konstanten.

Im Zusammenspiel mit JSDoc kennt TypeScript 5.0 zwei neue Auszeichnungen: @overload für überladene Funktionen und @satisfies für den in TypeScript 4.9 eingeführten Operator satisfies.

Weitere Neuerungen in TypeScript 5.0 finden sich im TypeScript-Blog. Die Programmiersprache lässt sich mit npm install typescript installieren oder über NuGet herunterladen.

(rme)