Am 2018-03-15 wurde der erste „release candidate“ von TypeScript 2.8 veröffentlicht.
Für mich sind folgende Features relevant:
- Conditional Types
- Granular Control on Mapped Type Modifiers
Conditional Types
Hiermit kann ich den Typen eines Ausdrucks zur Compile-Zeit dynamisch bestimmen. Benutzt werden dazu der ternären Auswahloperator ?:.
Hier ein Beispiel aus dem oben erwähnten Artikel:
|
|
Zuerst wird der Typ IdOrName definiert, der einen Typparameter T extends number | string hat. Dieser besagt, dass T entweder ein String oder eine Zahl sein kann und definiert sich dann über den „Conditional Type“. Wenn T vom Typen number ist, dann ist der Typ IdOrName<T> vom Typen Id in fast allen anderen Fällen vom Typen Name. Als nächstes wird die Funktion createLabel erzeugt, um ein paar Beispiele zu zeigen. Die Funktion hat einen Typparameter T, der nur number oder string sein kann und benutzt diesen im Parameter idOrName über den sich dann auch der Rückgabetyp IdOrName<T> ergibt. Gibt man den Wert 42 für den Parameter idOrName ein, !!! so ist der Rückgabetyp den effektiven Typen Id. Für die Werte "tim", [] oder auch {} würde der effektive Typ Name zurückgegeben werden. Es gibt 2 Sonderfälle, zum einen der Typ any, der alle Werte annehmen kann, entsprechend ist hier der effektive Typ auch Id | Name, das heist es ist der Typ Id oder Name. Zum anderen gibt es noch den Typen never. Dort wird der effektive Typ von IdOrName<T> zu never.
Granular Control on Mapped Type Modifiers
Als zweites neues Feature gibt es „Granular Control on Mapped Type Modifiers“. Damit kann man die readonly Eigenschaft und die undefined-Spezifität in Typen ändern, die einen Index-Accessor für das Objekt bereitstellen. Hier das Beispiel aus dem original Blog-Artikel:
|
|
Wir haben hier das Interface Foo, das die readonly-Eigenschaft abc und die optionale Eigenschaft def besitzt. Jetzt definieren wir den Typen Props mit den generischen Parameter T, der einen Index-Access bereitstellt. Als Index sind nur Attribute des Typen T erlaubt und der Accessor gibt auch die Werte einfach so zurück. Aus diesem Grund verhält sich der Typ IdenticalFoo genau so wie das Interface Foo. Soweit so gut, jetzt die Neuerung:
|
|
Durch die Angabe von -readonly beim Typen Mutable wird nun die Eigenschaft readonly des Interfaces ignoriert. Auch hinzugekommen ist, dass man optionale Felder zu erforderlichen Feldern machen kann:
|
|
Neben dem Entfernen der Eigenschaften von Attributen, kann man sie auch wieder hinzufügen:
|
|
Fazit
Es gibt noch ein paar mehr Änderungen im Bereich JSX. Da ich diese aktuell nicht anwende, hat das für mich derzeit keine Relevanz. Das könnte sich mit Stencil allerdings ändern.
Insgesamt bin ich mit der Entwicklung von TypeScript weiterhin sehr zufrieden.
Tim Schumacher