【TypeScript】を料理で例えてみた。

# はじめに

こんにちは！
ガク@Necono_Engineerと申します！
プログラミングスクール<font color="Orange">RUNTEQ</font>で現在Ruby on Railsを中心に学んでいます。普段の学習から一転、今回はモダンな技術である <font color="CornflowerBlue">`TypeScript`</font> に挑戦してみました!

# 概要
ポートフォリオ作成がきっかけで<font color="Aqua">`React`</font>に触れる機会がありました。
そこで出会ったのがTypeScriptです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/7e222b1a-a846-66a8-4ffc-11c251afdb6e.png)


<font color="CornflowerBlue">TypeScript。</font>
「なんか、<font color="Yellow">JavaScript</font>っぽい名前だな」
最初はそんな単純な疑問からスタートしました。
名前のイメージだけでなく、実際触れてみて学んだこと、気づいたことを皆さんにシェアできればと思います!


:::note warn
プログラミング初学者のため、内容に誤りがある可能性がございます。
もし間違いがあればご指摘いただけると幸いです。
:::

# 初めてのTypeScript【ECMAScript】
TypeScriptを学んでいるとまず初めに**ECMAScript**という言葉に出会いました。

**ECMAScript**はJavaScriptのレシピのようなものです。

![レシピECMA.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/3fcfba1a-accd-c9f2-9db8-97c48c09b881.jpeg)

ECMAScriptという基本のレシピを基に、JavaScriptを使ってブラウザで動作する"料理"、つまりWebページやWebアプリケーションを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/08dd1c6d-5aaa-bbc3-f562-4f4e905a55ac.png)!![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/7773f081-8b22-dab9-d576-2f74c887dd05.png)
 ↑ エンジニア　　　　　　　　↑ Webアプリ(美味しそう)

**ECMAScript**にはバージョンがあります。

ES2015という言葉。
これはECMAScriptの、2015年に改定されたバージョンのことを指します。
モダンJavaScript(React、Vueなどの仮想DOMを用いるライブラリ・フレームワーク)は主にES2015以降の記法が使われています。

# ECMAScriptとブラウザ問題

ECMAScriptに新しいバージョンがリリースされることでJavaScriptがアップデートされ新機能が追加されます。

しかし、このバージョンはJavaScriptの実行環境によってシンタックスのサポートの差が出てきてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/21c1492c-7f76-513b-2740-8012e56fc1bf.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/58f38aaa-5b5f-e27d-08e6-9135d915ab65.png)

ES2021で書かれたスクリプトはGoogle Chrome,Firefox,Safari,Microsoft Edgeで使用可能です。
しかし、Internet Explorerでは構文エラーとなってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/a74b89fc-8c98-820d-0c05-225420821077.png)

レシピが変わると今まで作っていた人が困ってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/2e870477-b790-4ce4-787e-69df6be25b00.png)

そこで登場するのが"トランスコンパイラ"です。



## トランスコンパイラって？
トランスコンパイラは料理のレシピを翻訳するようなツールです。
有名なものに"**Babel**"があります。Babelは最新のJavaScriptという「難しい料理」のレシピを、誰でも使える古いJavaScriptという「簡単な料理」のレシピに変換してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/73d0ed46-2adc-c36e-1c0e-eb28eea45a02.png)

つまり、ES2020などの新しいバージョンのJavaScriptのコードを、ES5などの古いバージョンのブラウザでもサポートされているコードに変換できるということです。
<font color="Yellow">`JavaScript(新)`</font>を<font color="Yellow">`JavaScript(古)`</font>に変換します。

そして

<font color="CornflowerBlue">`TypeScript`</font>を<font color="Yellow">`JavaScript`</font>に変換するトランスコンパイラもあります。

それが"**tscコマンド**"です。



## tsc(TypeScript Compiler)って？

```
npm install -g typescript@4.3.5
```
上記コマンドでTypeScriptをインストールすると`tsc`コマンドを使用できるようになります。
`tsc`はTypeScriptで書かれたコード(TSファイル)の型チェックを行い型のエラーがなければ型情報を抜いたコード(JSファイル)に変換して出力してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/8b2ebfb6-4762-69a3-923a-872a4f8d3655.png)

これは料理で例えるなら「味見」です。

お客様の目の前(ブラウザ)に下手な料理は出せません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/3c0bfcb8-c161-29dd-4fe0-46ae90a69213.png)

TypeScriptで書かれた料理の材料(コード)が、料理のレシピ(型定義)と合っているか確認（味見）して、材料に問題があると指摘してくれるので、おいしく安全な料理(アプリケーション)が提供できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/7773f081-8b22-dab9-d576-2f74c887dd05.png)
(安心安全な料理)


フレームワークを用いず、JavaScriptを使用することを「バニラJavaScript」といいます。バニラJavaScriptは名前の通りバニラのように柔軟で、コードの組み立てにおいても何の制限もなく、自由です。このことを動的型付けと呼びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/80f18a61-432d-2730-95f0-7a3db70f2b9f.png)


しかし、その自由度のデメリットとして型チェックがプログラミングを実行しながらでしか行われないため、**実行中にエラー**が起こりやすいです。

これに対して、TypeScriptは静的型付けを行うことで、**実行前にエラーを検出**できます。

1️⃣ Babelは最新のJavaScriptを古いJavaScriptに翻訳します。
2️⃣ tscコマンドはTypeScriptをJavaScriptに翻訳し、型定義と合っているかチェックします。


こうすることで、最新のJavaScriptを使い、しっかりとチェックもできるので、誰でも安心してJavaScriptの開発ができるようになります。


つまり、TypeScriptは静的型付けによって実行時のエラーを減らしたJavaScriptの上位互換なんです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/e77d1ea5-f5eb-37ed-42c5-8bccff3c1b89.png)




# まとめ
TypeScriptには数種類の型定義の方法など、まだまだ覚えることはたくさんあります。道のりは長いですがこれからも新しい技術のキャッチアップを楽しんでいきたいと思います！

# 参考文献
- [手を動かしながら学ぶTypeScript](https://www.amazon.co.jp/%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6-TypeScript-%E6%B8%A1%E9%82%89-%E6%AF%94%E5%91%82%E6%A8%B9/dp/4863543557)
- [初めてのTypeScript](https://www.oreilly.co.jp/books/9784814400362/)