TypeScript

**TypeScript** はマイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語である。TypeScriptはJavaScriptに対して、省略も可能な静的型付けとクラスベースオブジェクト指向を加えた厳密なスーパーセット（既存のものを全て含んだ上でより機能が拡張されている上位互換となるモノ）となっている。C#のリードアーキテクトであり、DelphiとTurbo Pascalの開発者でもあるアンダース・ヘルスバーグがTypeScriptの開発に関わっている。TypeScriptはクライアントサイド、あるいはサーバサイド (Node.js) で実行される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 をサポート可能である。

## 歴史
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がリリースされ、非許容型への対応を含む幾つかの機能が盛り込まれた。

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がサポートされた。

2023年3月16日、TypeScript 5.0がリリースされ、decoratorsがサポートされた。

2025年3月11日、TypeScriptのリードアーキテクトであるアンダース・ヘルスバーグはTypeScriptのコンパイラと各種ツール群をGoに移植する「Project Corsa」を実施中であることを発表した。ヘルスバーグはGoにネイティブ移植することでコンパイラの処理速度が約10倍に高速化し、メモリ使用量も大幅に削減されることを示した。Goを採用した理由について、ヘルスバーグは既存のTypeScriptで書かれたコンパイラとの構造的な互換性を重視したこと、メモリ管理が容易であること、複雑なグラフ処理を効率的に処理できることなどの技術要件によるものだと述べている。従来のJavaScriptベースの実装はTypeScript 6.xとして開発し、ネイティブ実装は既存のTypeScriptと十分な互換性を持った時点でTypeScript 7.0としてリリースされる計画である。

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

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

## 言語の特徴
TypeScriptはJavaScript（ECMAScript 5）に次のような言語機能の拡張を加えたものである。

ECMAScript 6由来
* クラス
* アロー関数式（無名関数）
* オプション引数、デフォルト引数
* let, const
* テンプレート文字列：文字列内への変数埋め込み
* モジュール
* for/of
* 分割代入
* Symbol
ECMAScript 7由来
* デコレーター
* async/await
独自
* 型注釈（変数、引数、戻り値などの型宣言）とコンパイル時の型チェック
* 型推論、型ガード - if文の instanceof などを利用した型推論
* インタフェース
* 列挙型
* Mixin
* ジェネリック
* 名前空間
* タプル型
* 共用体型、
* 型エイリアス

構文的には、静的型付けやクラス、継承、インタフェースのようなオブジェクト指向、名前空間などの機能を追加する、ECMA-262 言語標準のマイクロソフトによる実装であるJScript.NETとTypeScriptはよく似ている。

### 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の動的型付けを使うこともできる。


```typescript
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++におけるヘッダファイルとよく似ている。

```typescript
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に公開されている。リポジトリから型宣言ファイルを検索しインストールするのを補助するために`[https://github.com/typings/typings typings]`というコマンドラインユーティリティが提供されている。

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

## 開発ツール
### コンパイラ
TypeScriptコンパイラ`tsc`自体もTypeScriptで作成されている（セルフホスティング）。これは通常のJavaScript にコンパイルでき、任意のホスト上のJavaScriptエンジン（たとえばブラウザなど）上で実行できる。ライセンスは Apache License 2.0である。コンパイラ・パッケージはコンパイラを実行出来るスクリプトホストに同梱されてくる。Node.js等と共にコンパイラ・パッケージとして配布される場合もある。

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

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

### 開発環境
以下の統合開発環境やテキストエディタがTypeScriptに対応している。
* Microsoft Visual Studio
** 2013 Update 2から標準搭載
** JetBrains社によるReSharperプラグイン
* Visual Studio Code
* WebMatrix
* IntelliJ IDEA、WebStorm
* Eclipse - Eclipse TypeScript Plug-in、TypEcs
* NetBeans - NetBeans TypeScript Editor
* テキストエディタ - Sublime Text、Emacs、Vim
* クラウド型IDE - Cloud9 IDE、Codenvy、Codeanywhere

## 関連項目
* JavaScript
* ECMAScript
* Babel (トランスコンパイラ)
* Dart
* AtScript
* Node.js
* Deno

## 注釈

## 外部リンク
* 
*