TypeScript

歴史

TypeScriptはマイクロソフトで2年間かけて内部開発された後、2012年10月に初めて外部に公開された (version 0.8)。発表から間もなく、ミゲル・デ・イカザは、この言語そのものについては称賛しつつも、Microsoft Visual Studio以外では成熟した統合開発環境 (IDE) でのサポートがなく、LinuxおよびOS Xでは利用できないことには批判的であった。2013年時点では、他のIDEでもサポートされており、特にEclipseでは、Palantir Technologies社が貢献したプラグインによりサポートされている。Emacs、Vim、Sublime などの多くのテキストエディタもTypeScriptをサポートしている。Atomプラグインも利用可能である。
2013年にリリースされたTypeScript 0.9では、総称型のサポートを追加した。TypeScript 1.0は Build 2014会合でリリースされた。Visual Studio 2013 Update 2ではTypeScriptが組み込まれている。
2014年7月、開発チームは新しいTypeScriptコンパイラを発表し、パフォーマンスは5倍増加したと公称している。同時に、当初はCodePlex上で公開されていたソースコードはGitHubに移動された。
2016年9月22日、TypeScript 2.0がリリースされ、null非許容型への対応を含む幾つかの機能が盛り込まれた。
2017年2月にTypeScript 2.2がリリースされて以降は、それまで不定期だったバージョンアップを2ヶ月に1回行うリリースサイクルが定められた。

背景

TypeScriptはマイクロソフトやその外部の顧客たちの間で、JavaScriptで大規模アプリケーション開発をする上での欠点を補うために作られた。複雑なJavaScriptコードを扱うのは困難なことから、JavaScript言語の中でコンポーネント群を開発するのを容易にするための自作ツールが必要になった。
TypeScriptの開発者は、標準との互換性や、クロスプラットフォームサポートを壊さないで済む解決策を模索した。現在のECMAScript言語標準が将来的にクラスベースオブジェクト指向をサポートする提案があることを踏まえ、TypeScriptはその提案に基づくことになった。これにより、その提案に基づいたスーパーセットであり、幾つかの点で言語の文法を拡張したJavaScriptコンパイラへと至ることとなった。このコンパイラが、言語を拡張した部分を一般的な JavaScriptへと変換する仕組みである。この意味ではTypeScriptはECMAScript 2015において期待されている機能を先取りするようなものであるともいえる。ECMAScriptの提案にないがTypeScriptに独自に搭載された機能として、静的言語解析を可能にする静的型付け機能(使用するかどうかは選択可能)がある。これは諸ツールや統合開発環境(IDE)によるサポートを容易にする。

JavaScriptとの互換性

TypeScript はECMAScript 2015の厳密なスーパーセットであり、ECMAScript 2015はECMAScript 5(一般的にJavaScriptと呼ばれているもの)のスーパーセットである。従って、JavaScriptプログラムは有効なTypeScriptプログラムでもあるので、TypeScriptプログラムはJavaScriptを境目なしに利用できる。
デフォルト設定の場合、コンパイラはECMAScript 3を出力するが、オプションによりECMAScript 3から最新のECMAScriptまでの間で出力対象を選択することができる。
TypeScriptでは、既存のJavaScriptコードを使うことができる。つまり、人気のあるJavaScriptライブラリを取り入れることができ、他のJavaScriptからTypeScriptで作られたコードを呼ぶこともできる。これらの外部ライブラリに対する型宣言は、DefinitelyTyped（後述）に収録されていればnpmを用いて簡単にインストールすることができる。

型アノーテーション

TypeScriptはコンパイル時における型検査を可能にするために、型アノーテーションによる静的型付けの仕組みを提供している。この仕組みの利用は任意なので、この仕組みを無視して普通のJavaScriptの動的型付けを使うこともできる。
function add(left: number, right: number): number {
return left + right;}
プリミティブ型のためのアノーテーションはnumber、boolean、stringである。弱い型付けあるいは動的型付けにする場合は、any型を用いる。
既にJavaScriptにコンパイルされた型を使うTypeScriptスクリプトから型情報を利用できるようにするために、型アノーテーションは別個の「宣言ファイル」に外出しすることが出来る。アノーテーションは、Node.jsやjQueryに対して行われたように、既存のJavaScriptライブラリに対しても宣言できる。
型が与えられていない場合、TypeScriptコンパイラは型を推論するために型推論を使う。例えば、上のコードにおけるadd メソッドは、もし戻り値型が何も与えられていなかったとしても、number型を返すと推論される。これは引数leftとrightが number型であること、および「二つのnumber型を加算した結果は常にnumber型である」というコンパイラ側の知識に基づいている。しかし、明示的に戻り値型を指定しておけば、コンパイラがその正しさを検証してくれる。
宣言の不足により型推論が不可能な場合、動的なany型がデフォルトで使われる。any型の値に対する操作は、JavaScriptと同様の操作をサポートしているので、any型に対する操作については最低限の静的型検査が行われるだけである。

型宣言ファイル

TypeScriptをコンパイルするとき、「型宣言ファイル」（拡張子.d.ts）を生成するオプションがある。この型宣言ファイルは、コンパイルされてできたJavaScript内のコンポーネントへのインタフェースの役割を果たす。コンパイラは、型宣言ファイルの作成過程で、関数やメソッドのコードの中身はすべて除去し、出力される型のシグネチャだけを残す。その結果として出来た型宣言ファイルには、出力されたJavaScriptライブラリまたはモジュールの仮想的なTypeScript型が記述してあり、第三者がTypeScriptを書くとき、この型宣言ファイルを読み込んで使うことが出来る。
この型宣言ファイルの概念は、C言語やC++におけるヘッダファイルとよく似ている。
declare module arithmetics {
    add(left: number, right: number): number;
    subtract(left: number, right: number): number;
    multiply(left: number, right: number): number;
    divide(left: number, right: number): number;}
既存のJavaScriptライブラリのための型宣言ファイルは、手書きで書くこともでき、それは既にjQueryやNode.jsに対して行われた。
jQuery、MongoDB、D3.js、Node.jsといった人気のあるJavaScriptライブラリに対する型宣言ファイルを多数集めたものが、GitHubのDefinitelyTypedや Typings Registryに公開されている。リポジトリから型宣言ファイルを検索しインストールするのを補助するためにtypingsというコマンドラインユーティリティが提供されている。

コンパイラ

TypeScriptコンパイラtsc自体もTypeScriptで作成されている（セルフホスティング）。これは通常のJavaScript にコンパイルでき、任意のホスト上のJavaScriptエンジン（たとえばブラウザなど）上で実行できる。ライセンスは Apache License 2.0である。コンパイラ・パッケージはコンパイラを実行出来るスクリプトホストに同梱されてくる。Node.js等と共にコンパイラ・パッケージとして配布される場合もある。
また、JavaScriptで書かれたクライアントサイドのコンパイラのアルファ版もある。これはページロード中にTypeScriptコードを実行する。
TypeScriptで書いたコードをブラウザ上で実行するにはコンパイルが必要。
tsc --strict -t es5 *.ts