TypeScript

TypeScript はマイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語である。TypeScriptはJavaScriptに対して、省略も可能な静的型付けとクラスベースオブジェクト指向を加えた厳密なスーパーセットとなっている。C#のリードアーキテクトであり、DelphiとTurbo Pascalの開発者でもあるアンダース・ヘルスバーグがTypeScriptの開発に関わっている。TypeScriptはクライアントサイド、あるいはサーバサイド  で実行されるJavaScriptアプリケーションの開発に利用できる。

TypeScriptは大規模なアプリケーションの開発のために設計されている。

TypeScriptはJavaScriptのスーパーセットであるため、既存のJavaScriptプログラムは、全て有効なTypeScriptプログラムとなる。

TypeScriptは型定義ファイルをサポートしており、既存のJavaScriptライブラリに型情報を付与して利用できる。既存のオブジェクトファイルの構造を記述できるC/C++のヘッダファイルとよく似た仕組みである。これによって、その型定義ファイル内で定義された値を、他のプログラムがあたかも静的に型付けされたTypeScriptエンティティであるかのように利用することができるようになる。jQuery、MongoDB、D3.jsのような人気のあるライブラリのための、サードパーティーのヘッダファイルがある。Node.jsベーシック・モジュールのためのヘッダも入手可能で、Node.jsプログラムの開発もTypeScriptの中で行える。

TypeScriptの主要な実装は、自身もTypeScriptで書かれた、JavaScriptへのトランスコンパイラである。ライセンスはApache 2 License。

TypeScriptはMicrosoft Visual Studio 2013 Update 2以降でfirst-classプログラミング言語として、C# やその他のマイクロソフト言語群とともに含まれるようになった。 公式の拡張パックによりMicrosoft Visual Studio 2012 でも TypeScript をサポート可能である。

1. 歴史
-----

TypeScriptはマイクロソフトで2年間かけて内部開発された後、2012年10月に初めて外部に公開された 。発表から間もなく、ミゲル・デ・イカザは、この言語そのものについては称賛しつつも、Microsoft Visual Studio以外では成熟した統合開発環境  でのサポートがなく、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回行うリリースサイクルが定められた。

2018年7月30日、TypeScript 3.0がリリースされ、残りのパラメーターと展開式のタプル、タプル型を持つ残りのパラメーター、ジェネリックな残りのパラメーターなど、多くの言語機能が追加された。

2020年8月20日、TypeScript4.0がリリースされ、4.0では重大な変更はされていないが、カスタムJSXファクトリやVariadic Tuple型などの言語機能が追加された。

2022年11月15日、TypeScript4.9がリリースされ、新たにsatisfies演算子が導入され、ECMAScriptの次期機能auto-accessorsがサポートされた。

2. 背景
-----

TypeScriptはマイクロソフトやその外部の顧客たちの間で、JavaScriptで大規模アプリケーション開発をする上での欠点を補うために作られた。複雑なJavaScriptコードを扱うのは困難なことから、JavaScript言語の中でコンポーネント群を開発するのを容易にするための自作ツールが必要になった。

TypeScriptの開発者は、標準との互換性や、クロスプラットフォームサポートを壊さないで済む解決策を模索した。現在のECMAScript言語標準が将来的にクラスベースオブジェクト指向をサポートする提案があることを踏まえ、TypeScriptはその提案に基づくことになった。これにより、その提案に基づいたスーパーセットであり、幾つかの点で言語の文法を拡張したJavaScriptコンパイラへと至ることとなった。このコンパイラが、言語を拡張した部分を一般的な JavaScriptへと変換する仕組みである。この意味ではTypeScriptはECMAScript 2015において期待されている機能を先取りするようなものであるともいえる。ECMAScriptの提案にないがTypeScriptに独自に搭載された機能として、静的言語解析を可能にする静的型付け機能がある。これは諸ツールや統合開発環境によるサポートを容易にする。

3. 言語の特徴
--------

TypeScriptはJavaScript  に次のような言語機能の拡張を加えたものである。

ECMAScript 6由来

クラス
アロー関数式
オプション引数、デフォルト引数
let, const
テンプレート文字列 : 文字列内への変数埋め込み
モジュール
for/of
分割代入
SymbolECMAScript 7由来

デコレーター
async/await独自

型注釈とコンパイル時の型チェック
型推論、型ガード - if文の instanceof などを利用した型推論
インタフェース
列挙型
Mixin
ジェネリック
名前空間
タプル型
共用体型,
型エイリアス構文的には、静的型付けやクラス、継承、インタフェースのようなオブジェクト指向、名前空間などの機能を追加する、ECMA-262 言語標準のマイクロソフトによる実装である JScript.NET と TypeScript はよく似ている。

3.1. JavaScriptとの互換性
--------------------

TypeScript はECMAScript 2015の厳密なスーパーセットであり、ECMAScript 2015はECMAScript 5のスーパーセットである。従って、JavaScriptプログラムは有効なTypeScriptプログラムでもあるので、TypeScriptプログラムはJavaScriptを境目なしに利用できる。

デフォルト設定の場合、コンパイラはECMAScript 3を出力するが、オプションによりECMAScript 3から最新のECMAScriptまでの間で出力対象を選択することができる。

TypeScriptでは、既存のJavaScriptコードを使うことができる。つまり、人気のあるJavaScriptライブラリを取り入れることができ、他のJavaScriptからTypeScriptで作られたコードを呼ぶこともできる。これらの外部ライブラリに対する型宣言は、DefinitelyTypedに収録されていればnpmを用いて簡単にインストールすることができる。

3.2. 型アノーテーション
--------------

TypeScriptはコンパイル時における型検査を可能にするために、型アノーテーションによる静的型付けの仕組みを提供している。この仕組みの利用は任意なので、この仕組みを無視して普通のJavaScriptの動的型付けを使うこともできる。

function add: 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型に対する操作については最低限の静的型検査が行われるだけである。

3.2.1. 型宣言ファイル
--------------

TypeScriptをコンパイルするとき、「型宣言ファイル」を生成するオプションがある。この型宣言ファイルは、コンパイルされてできたJavaScript内のコンポーネントへのインタフェースの役割を果たす。コンパイラは、型宣言ファイルの作成過程で、関数やメソッドのコードの中身はすべて除去し、出力される型のシグネチャだけを残す。その結果として出来た型宣言ファイルには、出力されたJavaScriptライブラリまたはモジュールの仮想的なTypeScript型が記述してあり、第三者がTypeScriptを書くとき、この型宣言ファイルを読み込んで使うことが出来る。

この型宣言ファイルの概念は、C言語やC++におけるヘッダファイルとよく似ている。 declare module arithmetics { add: number; subtract: number; multiply: number; divide: number; } 既存のJavaScriptライブラリのための型宣言ファイルは、手書きで書くこともでき、それは既にjQueryやNode.jsに対して行われた。

jQuery、MongoDB、D3.js、Node.jsといった人気のあるJavaScriptライブラリに対する型宣言ファイルを多数集めたものが、GitHubの[1]や [2]に公開されている。リポジトリから型宣言ファイルを検索しインストールするのを補助するために[3]というコマンドラインユーティリティが提供されている。

3.3. モジュール
----------

TypeScriptはコンパイルターゲットとして様々な環境をサポートしている。そのためそれらに対応した多様なモジュール/ローダーシステムに対応している。tsconfigの module 属性を用いることで ES6, ES2020, node ESM, CommonJS, AMD, UMD に適合したトランスパイルをおこなうことができる。

4. 開発ツール
--------

4.1. コンパイラ
----------

TypeScriptコンパイラtsc自体もTypeScriptで作成されている。これは通常のJavaScript にコンパイルでき、任意のホスト上のJavaScriptエンジン上で実行できる。ライセンスは Apache License 2.0である。コンパイラ・パッケージはコンパイラを実行出来るスクリプトホストに同梱されてくる。Node.js等と共にコンパイラ・パッケージとして配布される場合もある。

また、JavaScriptで書かれたクライアントサイドのコンパイラのアルファ版もある。これはページロード中にTypeScriptコードを実行する。

TypeScriptで書いたコードをブラウザ上で実行するにはコンパイルが必要。

4.2. 開発環境
---------

以下の統合開発環境  やテキストエディタがTypeScriptに対応している。

Microsoft Visual Studio
2013 Update 2から標準搭載
JetBrains社によるReSharperプラグイン
Visual Studio Code
WebMatrix
IntelliJ IDEA, WebStorm
Eclipse - [4], [5]
NetBeans - [6]
テキストエディタ - Sublime Text, Emacs, Vim
クラウド型IDE - Cloud9 IDE, Codenvy, Codeanywhere

5. 関連項目
-------

JavaScript
ECMAScript
Babel 
Dart
AtScript
Node.js
Deno

6. 注釈
-----

7. 外部リンク
--------