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)
- Rainald Menge-Sonnentag
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.
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)