TypeScript first impression
MicroSoftから TypeScript というJavaScriptにコンパイルされるプログラミング言語がリリースされた。JavaScriptにコンパイルされる言語はJSX, CoffeeScript, Haxe, Dartなど数多いが、構文がJavaScriptのスーパーセットである点が従来のJavaScript系言語と大きく異なる点だと思われる。
総じて見るとTypeScript自体は際立った特徴は見られない。Visual Studioによるサポートを強化するためにJavaScriptに少しだけ手を入れたという印象だ。
TechCrunchの記事によれば、特徴は「オプショナルな静的型付け」「クラス構文」「モジュール機構」「Visual Studioのプラグイン」ということらしい。
クラス構文は、ES4をベースとしたJSXやHaxeと異なりES6風になっている。モジュール機構の詳細は不明だが、JSの名前空間を侵食しないためのもののようだ。つまり、モジュールMのなかで定義したTSのクラスCは、JSからM.Cとして参照できる*1。
オプショナルな静的型付け+IDEサポートというのはDartに似たアプローチだが、Dartと異なり構文はJavaScriptのスーパーセットである。
インストールは npm install -g typescript
で行えるようなので、少し使ってみた。JSXの example/flying-being.jsxを参考にクラスとインターフェイスを書いてみる。
interface Flyable { fly() : void; } class Animal { eat() : void { console.log("An animal is eating!"); } } class Bat extends Animal { fly() : void { console.log("A bat is flying!"); } } // JavaScriptのようにトップレベルに関数を定義できる function takeFlyable(flyingBeing : Flyable) : void { flyingBeing.fly(); } // トップレベルに式を書くこともできる! // つまりmain()のようなエントリポイントは存在しない // また、Batは直接Flyableをimplementsしていないが、 // Flyableに適合するインターフェイスを持っているのでFlyableとみなせる takeFlyable(new Bat);
クラス構文がES6と同じなので特に問題なくコーディングができた。コンパイル後のJavaScriptもデバッグ可能なコードで、クラス継承もいまや一般的となったCoffeeScript同様のproxyを使うパターンである。
ほかいくつか気づいた点をあげておく。
- 型チェックはオプショナル
- 存在しないメソッドの呼び出しはコンパイル時警告
- ローカル変数は型推論される
- つまり
var b = new Bat; b.hoge();
は警告される
- つまり
- 関数のパラメータは推論されない(おそらくany扱い)
- したがって型チェックのためには関数のパラメータの型アノテーションは必須
- thisのセマンティクスはJavaScript互換(JSのスーパーセットである以上そうせざるを得ない?)
- つまり
var self = this;
イディオムは健在
- つまり
- JavaScriptからはCoffeeScript並に自然に使える