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並に自然に使える