03 October 2012 CoffeeScript, Dart, TypeScript Robert Muehsig

Die TypeScript Preview – Microsofts “Erweiterung” für Javascript Entwicklung - ist seit wenigen Tagen veröffentlicht. Wie so vielen anderen hab ich zuerst an Dart oder Coffeescript gedacht - und das nicht gerade in einem positiven Sinn. Microsofts letzten großen Erfolge im Webclient Bereich sind (gefühlt) schon eine Weile her: Prominentestes Negativ-Beispiel ist Silverlight, aber auch mit den ASP.NET AJAX Toolkit hatten sich die Microsoftis nicht mit Ruhm bekleckert.

Ganz kurz: Was ist TypeScript?

TypeScript ist eine typisierte Form von Javascript, welche einen eigenen Compiler mitbringt und den Code direkt in Javascript umwandelt, sodass er überall lauffähig ist. Keine neue VM, kein “das soll Javascript ablösen” – nur etwas womit man Javascript Code produzieren kann.

Was gibts es für offizielle Quellen und wo finde ich einen ersten Einstieg?

Es gibt fast alles auf der offiziellen Website zum Nachlesen. Bekannt und empfehlenswert ist natürlich auch das “Introducing TypeScript” von Anders Hejlsberg (BTW: er ist einer der C# Väter) – in den ersten Minuten erklärt er wozu TypeScript gut ist und was es genau ist.
Ein kleines Tutorial habe ich hier gefunden – ich denke im Laufe der nächsten Tage werden dutzende “So sieht TypeScript aus”-Blogposts entstehen.

Wie sieht das Tooling aus?

Für Visual Studio 2012 Entwickler gibt es das Plugin, neben den Source Code und der Anleitung für Node.js Entwickler direkt auf der TypeScript Seite. Das “Web Essentials” Plugin von Visual Studio hat sogar bereits ein “Split”-Screen für TypeScript und die Umwandlung zu Javascript implementiert.

Von der Microsoft Open Source Truppe gibt es zudem noch TypeScript Syntax Support für Sublime Text, Emacs und Vim.

Wozu soll TypeScript gut sein?

image

(Bild Quelle)

Javascript hat große Stärken: Es läuft in jedem Browser, auf jedem OS. Allerdings hat die Sprache seine Tücken. Jetzt kommt es noch darauf an welche Erfahrung der Entwickler mitbringt: Kommt der Entwickler aus der Java oder C# Welt wird er schnell Klassen, Module und Namespaces & co. vermissen. Andere wiederum haben noch nie das verlangen nach Klassen und starker Typisierung gehabt. Hier sieht man schon: Auf einen nenner zu kommen wird schwierig.

Erklärtes Ziel von Microsoft: TypeScript soll es erleichtern große Javascript Applikationen zu erstellen.

Empfehlenswert für diese Frage ist auch der Blogpost von Scott Hanselman (und die Kommentare).

Was ist der Unterschied zu normalen Javascript?

Größter Unterschied ist, dass man in TypeScript Klassen und Schnittstellen beschreiben kann. Ein Blick auf die Beispiele schadet hier nicht. Bei den Beispielen ist allerdings auch viel “normaler” Javascript Code zu sehen, welcher mit TypeScript noch erweitert wurde. Dies ist eines der Hauptfeatures von TypeScript.

Was ist der Unterschied zu CoffeeScript?

image

CoffeeScript hat einen speziellen Syntax, der mehr an Ruby als an die C-Sprachen angelehnt ist. Zudem kann man in CoffeeScript selber kein “normales” Javascript benutzen – dies geht allerdings mit TypeScript. Jeder Javascript Code ist schon TypeScript, d.h. man kann bestimmte Features von TypeScript nutzen und trotzdem keinen “Bruch” riskieren.

Was ist der Unterschied zu Dart? Es gibt sogar Feedback vom Google Dart Team!

image Dart ist vom Syntax her näher an TypeScript dran – die Verwandtschaft zu Java & co. sieht man der Sprache durchaus an. Auch hier ist Typisierung eines der Hauptelemente. Allerdings verfolgt Dart einen radikaleren Ansatz als TypeScript:

Dart ist nicht nur “Syntax”, sondern bringt auch eine eigene VM mit – kann den Code allerdings auch zu Javascript umwandeln. In Dart selber kann man kein Javascript Code nutzen.

Auf Reddit hat sich sogar ein Google Dart Team Mitglied zu TypeScript geäußert:

I'm on Google's Dart team, so I'm naturally looking at it from that angle/bias. Here's some random stuff that caught my eye, mostly comparing it to Dart. I've only spent a few minutes skimming, so don't take any of this too seriously...

No generics

I guess some types are better than no types at all, but it's really rough to lose those. TypeScript does have built-in array types and object types cover some of the "map" type use cases. But not being able to define your own generic types is a drag.

The docs say when added, generics will work using type erasure, which is what I'd expect given it's "compile to lightweight JS" style, but that can be a pain too. It's nice to be able to do stuff with your type arguments at runtime sometimes.

All types are nullable

Dart is the same way. Makes me sad in both cases.

The type annotation syntax is nice

Almost every language with optional type annotations (ML, Scala, F#, Kotlin, etc.) goes with "postfix after a :. Dart tries to use C-style type annotations which causes some nasty corner cases. I like what TypeScript has here, especially the syntax for function types:

function takeCallback(callback : (n : number) => number) { ... }

Interfaces are structurally typed, classes are nominally typed

Makes sense given that it's JavaScript, but it seems pretty neat. Being able to implicitly implement an interface is nice. But TypeScript doesn't seem to let you go the other way: given a class, you can't make a new type that's compatible with it without concretely extending it because of the brand stuff.

In Dart, thanks to implicit interfaces, you can.

Best common type can fail

That means this is a type error:

[1, true]

You can overload in interfaces by parameter signature

This is really cool because it gives you a way have more precise type inference flow through a function call that does some dynamic type switching. For example:

interface Doubler { double(s : string) : string; double(n : number) : number; }

With this, when the compiler sees a call to double, it can correctly give you a precise return type based on the inferred argument type.

What I'm not sure is how to actually implement a class that implements that interface and makes the type checker happy. You can't actually overload concrete methods, and my five minute attempt to make it happy by dynamic type checking didn't seem to work.

There's a dedicated syntax for array types

Make sense since there's no generics. It's also nice and terse, which is good, but I personally prefer general-purpose generics over one-off special case collections.

There's no implicit downcasting

One of Dart's more unusual type system features is that assignment compatibility is bidirectional: you can downcast without a warning. Aside from the typical special case of assigning to/from any (dynamic in other languages), TypeScript doesn't allow that. You have to type assert.

Personally, I like TypeScript's approach here.

Arrow functions and lexical this

This is just motherhood and apple pie. I like it. (Dart has this too, and this is always lexically bound.)

Overall, it looks pretty neat. If you want exactly the same JS semantics (good and bad) but also want a smattering of types, TypeScript seems decent. It's like Closure Compiler but with a better syntax.

If you want something that's a more aggressive step away from JS's syntax and semantics, then it seems like TypeScript isn't that.

Auf Reddit hat er noch einige weitere Fragen beantwortet.

Was sagen andere zu TypeScript?

Douglas Crockford, einer der Entwickler von Javascript), hat auf Google Plus seine Meinung zu TypeScript geäußert. Er findet die TypeScript gut, vor allem da das Thema strenge Typisierung beim nächsten ECMAScript Standard (der Standard zu Javascript) berücksichtig werden soll und es so mit TypeScript es nun erstmal eine Lösung gibt. Dies nimmt etwas den Druck vom Standardisierungsprozess. Er selbst findet allerdings das dieses Feature überbewertet wird.

Microsoft's TypeScript may be the best of the many JavaScript front ends. It seems to generate the most attractive code. And I think it should take pressure off of the ECMAScript Standard for new features like type declarations and classes. Anders has shown that these can be provided nicely by a preprocessor, so there is no need to change the underlying language.
I think that JavaScript's loose typing is one of its best features and that type checking is way overrated. TypeScript adds sweetness, but at a price. It is not a price I am willing to pay.

Auch Miguel de Icaza (Schöpfer hinter Mono) hat seine ersten Impressionen gebloggt. Größter Kritikpunkt: Aktuell ist alles sehr auf die Microsoft Software ausgeleget. Auch wenn alles Open Source ist, werden es erst Leute wirklich benutzen und erweitern wenn bereits deutlich mehr Arbeit in das Tooling auf andere Plattformen geflossen ist.

Und wie steh ich jetzt dazu? Das Beste seit geschnitten Brot oder doch eine neue Silverlight-like-Apokalypse?

imageIch hab bisher noch keine Zeit gehabt ernsthaft irgendwas damit zu machen, allerdings ist es am Ende nur ein weiteres Tool was Javascript Code produziert. Es soll nicht Javascript ablösen. Sowohl die Idee als auch vom Tooling her richtet sich stark an C# Entwicklerund das ist OK. Evtl. wird es eines der Tools sein, die man nur im Microsoft Lager kennt, vielleicht aber auch nicht.
Wie bei allen Compilern gilt allerdings: Man muss den kompilierten Code mögen – das trifft aber auch auf Dart und Coffeescript zu. Die scheinbar einfache Integration von bestehenden Javascript Code ist allerdings ein nettes Feature – eines was mich bislang immer von CoffeeScript und Dart abgeschreckt hatte (Motto: Ganz oder gar nicht.) – auch wenn man den generierten Javascript Code vom normalen Javascript aufrufen kann.

Wie immer gilt: Nimm das Tool was für dich passt.


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!