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.
(Bild: , gemeinfrei)
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.
Videos by heise
Frische Dekorateure
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.
Anwendungsfall Logging
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 {
// ...
}
Genauere Typinferenz dank konstanter Parameterdeklaration
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.
Konfigurationsdateien, Enumerations und JSDoc
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)