TypeScript: Interfaces Instanzseite und statische Seite

Posted by in TypeScript

Wie ist das mit der Instanzseite und der statischen Seite in TypeScript? Dieser Beitrag ist ein Erklärungversuch. Im Handbuch steht dazu Folgendes

When working with classes and interfaces, it helps to keep in mind that a class has two types: the type of the static side and the type of the instance side.

Einleuchtend oder? Für mich nicht! Vor allem wenn man sich das anschließend im Handbuch dargelegte Beispiel zu Gemüte führt.

Meine Erklärung

Meine Erklärung nimmt Interfaces zu Hilfe und eine Abbildung

statische und Instanzseite Interfaces und Klassen
image-527

Interfaces können sowohl die Instanzseite als auch die statische Seite einer implementierenden Klasse beschreiben


In TypeScript kann ein Interface die sogenannte Instanzseite eines Typs beschreiben. In dieser liegen Properties und Methoden. Außerdem kann es die statische Seite beschreiben, die in diesem Falle den Konstruktor enthält.

Es stellt sich natürlich die Frage, warum das jetzt so schwierig zu kapieren ist? Gehen wir mal davon aus, dass ein Interface sowohl die statische als auch die Instanzseite beschreibt. Zum Beispiel so:

Dummerweise kann keine Klasse dieses Interface korrekt implementieren, da der Compiler nie überprüft, ob der Konstruktor korrekt ist. Bei einer eigentlich korrekt implementierenden Klasse wird vom Compiler gemeckert:

Im Grunde genommen kann man sagen, dass ein Interface, das die statische Seite beschreibt „eigentlich nie“ implementiert werden kann.

Wo ist das dann nützlich?

Die Frage stellt sich natürlich. In Java kommt man sehr gut auch ohne die Beschreibung der statischen Seite aus. Ein möglicher Anwendungsfall sind jedoch Factories, die darauf angewiesen sind, dass der Konstruktor eine bestimmte Form hat.

Nehmen wir unser Beispiel von oben und teilen unser Interface in zwei separate Interfaces. Eines für die statische Seite RobotConstructor und eines für die Instanzseite RobotInterface mit einer Property name.

Wollen wir dazu eine Factory bauen, dann produziert diese Objekte vom Typ RobotInterface. Zur Erzeugung muss aber der richtige Konstruktor verwendet werden, damit die übergebenen Parameter auch stimmen. Die Implementierung sieht dann so aus:

Anschließend brauchen wir nur noch unsere Klasse Robot das Interface RobotInterface implementieren lassen und schon kann die Factory-Methode davon Objekte erzeugen

Und hier wird tatsächlich dann auch die statische Seite geprüft. Denn wird ein nicht passender Konstruktor verwendet, dann bekommt man einen Compiler-Fehler, den ich in einem weiteren Beitrag erläutern werde.

Fazit

Das Konzept der statischen und Instanzseite war für mich als hauptsächlichen Java-Entwickler etwas komisch. Ich frage mich, warum es erlaubt ist, beide Definitionen in einem Interface gleichzeitig zu benutzen. Aber das Konzept der statischen Seite taucht noch öfter im TypeScript Handbuch auf. Ich werde mich dazu noch schlau machen und einen weiteren Beitrag verfassen.