〜 じっくり入門 TypeScript 〜 1.全体像

筆者がTypeScriptを学ぶ上で読んだ [プログラミングTypeScript スケールするJavaScriptアプリケーション開発」](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0TypeScript-%E2%80%95%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8BJavaScript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Boris-Cherny/dp/4873119049/ref=sr_1_1?adgrpid=103678713334&dchild=1&gclid=Cj0KCQjw28T8BRDbARIsAEOMBcz6wwnlvQHG2JWw3ztLuusyBUPLgZC0RjhgrfvG9iDBsI35m9p47wwaAnEAEALw_wcB&hvadid=450367474969&hvdev=c&hvlocphy=1009308&hvnetw=g&hvqmt=e&hvrand=6413296769417029767&hvtargid=kwd-964915931247&hydadcr=27269_11561183&jp-ad-ap=0&keywords=%E3%82%AA%E3%83%A9%E3%82%A4%E3%83%AA%E3%83%BC+typescript&qid=1603410822&sr=8-1&tag=googhydr-22)を読んで終わりにしないために、記事という形でアウトプットしたかったので投稿します。タイトルはシリーズ化させたかったので、それっぽいものにしました。
誤った情報を記載していましたらコメントなどで教えていただけると嬉しいです。

では、早速書いていきます。

## TypeScriptの全体像
TypeScriptはTSC（TypeScriptコンパイラー）によって型チェックがなされた後に、JavaScriptコードにコンパイルされ実行されるというのが全体の流れです。

1.  TypeScriptソースコードをTypeScript AST(abstract syntax tree：抽象構文木)に変換
2.  ASTが型チェッカー（type checker）によってチェックされる → TypeScript最大の恩恵
3. TypeScript ASTをJavaScriptコードへ変換
4. JavaScriptコードをAST(abstract syntax tree：抽象構文木)に変換
5. ASTをバイトコード（仮想マシンが実行可能なコード：中間コードの総称）に変換
6. バイトコードがランタイムによって評価（実行）される

以上が大雑把ではありますが、TypeScriptが実行されるまでの全体像です。TypeScriptは静的型付け言語ですが、その型自体はTSC自体に評価されず、変換されるJavaScriptコードに影響を及ぼしません。**型チェッカーによってのみ評価されるので、めちゃくちゃなデータ型をTypeScriptコードで実装していたとしても、アプトプットされるJavaScriptにはなんの影響もないということです。**

## 型チェッカー（Type Checker）
これがあるからTypeScriptを書いていると言っても過言ではないでしょう。型チェッカーはTypeScriptを支える魔法です。コードが型安全であることを検証してくれます。これにより、**JavaScriptの場合、プログラムの実行時にほとんどのエラーが検出されていた（ユーザーテストなどで）ところが、プログラムの実装時に気づくことができるようになるのです。**ありがたいですね。

## tsconfig.json とは
全てのTypeScritpプロジェクトはルートディレクトリに```tsconfig.json```ファイルを含んでいなければなりません。

`tsconfig.json`とは一体何者でしょう？
TypeScriptプロジェクトを定義するためのファイルです。具体的には以下のような設定を記載して、TypeScriptプロジェクトを定義します。

| オプション | 説明 | 
|:-----------|:------------|
| **include**| TSCがTypeScriptファイルを見つけるためにどのフォルダーを探すべきか| 
| **lib**| コードを実行する環境にどのAPIが存在しているとTSCが想定すべきか。開発者自身がどのバージョンのTypeScriptを使用しているかによって想定されるJavaScriptAPIが含まれるか変化するので、それに対応したものを指定する| 
| **module**| TSCがどのモジュールシステムにコンパイルするべきか？（CommonJS, SystemJS, ES2015など） もっと大雑把にいうとどのようなJavaScriptに変換しますかというオプション| 
|**outDir**| 生成するJavaScriptコードをどのフォルダに格納すべきか| 
|**strict**| 不正なコードをチェックする時に、できるだけ厳格にチェックするようにできる。このオプションによって全てのコードに適切に型付けされていることが強制される。TypeScriptの恩恵を受けるためのオプションと言っても過言ではない。| 
| **target**| TSCがコードをどのバージョンのJavaScriptにコンパイルするべきか？（ES３、ES5、ES2015,ES2016など）| 

**実際にコードを記載したときの例**

```json:tsconfig.json
{
  "compilerOptions": {
    "lib": ["ES2015"],
    "module": "commonJs",
    "outDir": "dist",
    "sourceMap": true, //TypeScriptコードとそこから生成されたJavaScriptコードとの対応関係を記述したファイルを生成するかどうか
    "strict": true,
    "target": "es2015"
  },
  "include": [
    "scr"
  ]
}
```

## tslint.json とは？
コーディングルールを記載したファイルです。`tsconfig.json`とは異なり、こちらのファイルは必須ではありませんが、あった方が良いでしょう。特に複数人で開発する時はコーディングルールを明確にしておいた方が可読性や保守性があがるので作成した方が良いと思います。

以下のコマンドでファイルを生成できます。

```
./node_modules/.bin/tslint --init
```

なお、TsLintは2019年の時点で非推奨になっており、ESLint（JavaScriptのリンター）をTypeScript用のプラグインと共に使用することが推奨されます。
設定方法は以下の記事が参考になります。

[脱TSLintして、ESLint TypeScript Plugin に移行する](https://qiita.com/suzuki_sh/items/fe9b60c4f9e1dbc5d903)


## 終わりに
次回はTypeScriptのキモであり、TypeScriptをTypeScriptたらしめる最大の特徴**型について**投稿しようと思います。シリーズとして複数本投稿するつもりですので最後まで読んでくださった型は次回も読んでいただけると嬉しいです。

また冒頭にもお伝えいたしましたが、誤った情報を記載していましたらコメントなどで教えていただけると嬉しいです！