TypeScript 1.6: Endlich sinnvolle Mixins?

Posted by in JavaScript, TypeScript

Wie in meinem Artikel im JavaSpektrum beschrieben, gab es bis zur Version 1.6 keine richtige Untersützung für Mixins. Mixins waren nur mit einer zusätzlichen applyMixins() möglich und auch dann hatte man jede Menge Boilerplate-Code zu schreiben, die die ganzen Vorteile zunichte gemacht haben.

Intersection Types für die Rettung?

Mit Intersection Types sollen jetzt laut diesem Blogpost Mixins endlich sinnvoll einsetzbar sein. Aber stimmt das? Schauen wir uns dazu einfach das Beispiel aus dem Post genauer an:

Man braucht eine Methode, um zwei Instanzen zu mixen. So ganz erklärt das den Vorteil für mich noch nicht!

Ein Beispiel mit Klassen

Ich nehme praktischerweise mein Lieblingsbeispiel von Mixins. Die Methode applyMixins() zusammen mit der Anwendung des Codes habe ich ausgespart. Deutlich erkennbar sind die Stubs für walk und fly, die man mit angeben muss, damit die Klasse MyRobot kompiliert werden kann.

Klassen und Intersection Types

In meinem jugendlichen Leichtsinn, habe ich erwartet, dass Mixins jetzt so funktionieren, wie ich das auch aus Python kenne. MyRobot würde dann die Methoden walk() und fly() erben und könnte dann einfach this.walk() aufrufen.

Leider ist das nicht der Fall, es gibt einen Compiler-Fehler.

Eine nicht ideale Lösung

Tatsächlich habe ich es anders zum Laufen gebracht. Ich musste eine Instanz der Klassen Walk und Fly an extend() übergeben. Der Aufruf von fly() ist dann auch nicht ideal, da ich apply benutzen musste:

Damit sind wir zwar schon weiter als mit Boilerplate-Code. Die Benutzung fühlt sich aber immer noch sehr unintuitiv an.

Echte Mixins

Ich würde mir wünschen Mixins wie in Python zu haben (Quelle des Codes: Mixins in Python):

Die Schreibweise wäre dann, wie weiter oben bereits angesprochen:

Denkt man das konsequent weiter, wie in Python, hätte man damit ein sehr effizientes und verständliches Werkzeug zur Vererbung an der Hand.

So bleibt es leider ein halbgarer Workaround!

Fun-Fact nebenbei

Die Benamung von Intersection-Types ist irreführend. Tatsächlich handelt es sich hier um eine Vereinigung 😉