TypeScriptリファレンスを読んだ

チームでTypeScriptを使う機運の高まりを感じたので、最近出てイケてると言ううわさの
TypeScriptリファレンスを読んでみた。

TypeScriptリファレンス Ver.1.0対応

TypeScriptリファレンス Ver.1.0対応

本の内容は、TypeScriptの基本的な文法や開発環境などについて、網羅的に教えてくれるというものだ。JavaScriptについてあまり知らない人も読めるようになっているので、JavaScriptを使っている人であれば、分厚さの割には素早く読める(本文にもこの章は知ってたらとばしてよいと書いてある)。特に、TypeScriptをしっかり使った上でないとわからないような、実用上のアドバイスも書かれていて参考になる。例えば、型システムの微妙な動作をうまく回避する方法や、なぜそういった動作になっているかが、TypeScriptの開発コミュニティの議論を踏まえて解説されていたりする。

本書を読むと、JavaScriptととの互換性を壊さずに型システムを導入するために、涙ぐましい努力をしまくった結果がTypeScriptなのだということがわかる。

TypeScriptの言語機能は、JavaScriptからみると、型システムに関係ない部分は最低限しか追加されていない。classやmoduleの機能は追加されているが、ECMAScript 6などの標準を見据えているし、いきなりパターンマッチが使えるようになったり、部分適用がサポートされたりはしていない。実際、TypeScriptにはランタイムがほぼ必要なく(継承を使った時だけ6行だけランタイムが出力される)、比較的シンプルなJavaScriptのコードに変換されるだけだ。

型システムに関しては、変数やメソッドに型アノテーションを記述できたり、interfaceを定義することができるようになったりと、多くの言語機能が追加されるが、これらはコンパイラが型チェックに利用するだけで、最終的に出力されるJavaScriptのコードには現れない。型を削れば、素のJavaScriptとして使えますってのを目指してるんじゃないかと思う。

JavaScriptのライブラリを使うための型定義の記法が充実しているのもおもしろい。JavaScriptのオブジェクトは、たいへん柔軟なので、例えば、関数オブジェクトにプロパティを代入することで、関数としても呼び出せるし、モジュールのようにも使うことのできる。本書で例にあげられていたjQueryの$オブジェクトは$("#content")のように関数としても呼び出せるし、$.ajax(...)のようにモジュールのようにも使うことができる。$オブジェクトのTypeScriptの型定義を本書から引用したのが以下のコードだ。

interface JQueryStatic {
  (selector: string, context?: any): any; // $("#content") のような関数としての型定義
  ajax(url: string, setting?: any): any;  // $.ajaxの定義
}

declare var $: JQueryStatic;

こういった、複雑で型をとらえずらいオブジェクトにも型を与える方法があって、徹底してると思う。引数の型が変わるオーバーロードされた関数の定義の方法なんかもあって、JavaScriptの構造に型を与えることに対する情熱を感じる。DefinitelyTyped/DefinitelyTyped: The reposi... - GitHubが便利。

本書を読んだおかげで、TypeScriptがどういった言語を目指しているのかが理解できたように思う。チームに導入しても良さそうかという判断をするのには調度よかった。TypeScript自体については、言語機能に派手さはなくて無難という感じだけど、JavaScriptに型システムを載せるということについて、徹底して取り組んでいると感じた。伊達にTypeってついてなかった。ECMAScriptに型システムが追加されるということは、しばらくはなさそうだし、Dartのような代替言語がすべてのブラウザで実行できるようになるのも先に思う。純粋にJavaScriptに型システムがつきましたよということであれば、受け入れられやすく、ECMAScript 6世代くらいまではメンテされていて使っていけそうだなと感じた。

Kinedle版もあった

TypeScriptリファレンス Ver.1.0対応

TypeScriptリファレンス Ver.1.0対応