なぜTypeScriptを使うんですか？

## はじめに

皆さん、TypeScriptはもう使っていますか？
既に使っている方でしたら、もう型のない世界に戻りたくない方も多いと思います。

<img width="50%" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/9fa0f4d4-d036-5243-fc1d-e8bb4fbe034b.png>

"では、改めてなぜ我々はTypeScriptを使うのか？ "
"TypeScriptってなんだっけ？"

<img width="50%" src=https://3.bp.blogspot.com/-uNdqFVkDzOc/VJ6X78X0kmI/AAAAAAAAqSU/rKsouNvTaQc/s800/whitegirl3_1question.png>

それを今一度振り返ってみます。

## 本投稿のゴール

型システムに関するメリットの言語化・理解の向上をし、引き続き気持ちよくTypeScriptを使っていけたらと思います。
まだ使ってない方は使う際の動機の1つでも増やせたらいいなと思います。

<img width="50%" src="https://4.bp.blogspot.com/-4KG-yR1RBHo/UgsvErk97eI/AAAAAAAAXPE/ZsGPpUAIQUA/s800/gutspose_man.png">

## TypeScriptとは

> TypeScript extends JavaScript by adding types to the language.

**日本語**: TypeScriptは、JavaScriptに型を追加することでJavaScriptを拡張します。

> TypeScript speeds up your development experience by catching errors and providing fixes before you even run your code.

**日本語**: TypeScript は、コードを実行する前にエラーをキャッチして修正を提供することで、開発経験をスピードアップします。

つまり、TypeScriptは、JavaScriptに型システムを追加したものであり、型システムの恩恵を受けた開発が可能になる。

![イメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/74b9f41a-9458-bf5e-bfe9-c738c3175018.png)

[引用元: typescript公式サイト](https://www.typescriptlang.org)
[和訳: DeepL](https://www.deepl.com/translator): DeepLはニュアンスまで汲み取ってくれて本当に凄すぎる

## 型システム

型システムとはなんですか？
どんな性質のもの？その歴史は？立ち位置は？型システムとは、プログラミングだけのもの？
それを追っていってみます。

### 型システムとは

今回はWikiを覗いてみます。

> 型システム（英: type system）とは、プログラミング言語において、その式などの部分が持つ値を、その種類（型(type)、データ型も参照）に沿って分類し、プログラムが正しく振る舞うこと、といった性質について保証する手法である。

> プログラミング言語ごとにある型システムは型付けされたプログラムがどのようにふるまい得るかを規定し、その規則から外れたふるまいを不正であると判定する。

型システムの規定に沿ったプログラムを書いているか、判定するシステムという事ですね。
この型システムは形式手法を簡略化した、軽量形式手法の１つに分類されます。

型システムをより理解するためにwikiの特に関連が強そうな部分を主観的に判断し、紹介していきます。
まずは、用語の意味、定義が書かれているので、押さえていきます。

### 用語

**型**
> 「値の種類」が型である。

**型検査**
> プログラムにおけるエラーはさまざまだが、型に基づく一連のエラーがある。単純な例としては、浮動小数点数を表現しているデータを整数型として扱ってしまう、といったようなものである。この例では 0 と +0.0 のような特別な場合を除いてたいていの場合は得られる結果は無意味であり、より複雑な構造を持った値の場合は構造を壊して不正にしてしまうかもしれない。このような異常をプログラムが起こさないことを検査するのが型検査である。

![検査](https://4.bp.blogspot.com/-yhoRWIdFixo/VmFjq8GIRHI/AAAAAAAA1YA/f_94kKEr-wY/s800/pet_xray_cat.png)

**安全性**
> 型にまつわるものに限らず一般に、プログラムが言語で定義していない状態や、言語仕様で「未定義」とされている状態にならない、という性質。プログラムのエラーをランタイムやインタプリタが検出して異常終了するような場合も「安全」の側に含まれる。型にまつわる安全性が型安全性である。

> 型安全性が実現できる内容は言語に依存する。なぜならば、安全性とは「言語仕様で未定義とされている状態にならない」という性質である、つまり言語仕様によって決定されているからである。

### 性質

**可読性**
> 表現力の高い型システムでは型はプログラマの意図を説明することができるので、ドキュメントの役割を果たすこともある。例としてタイムスタンプが整数の派生型である環境において、プログラマが単なる整数ではなくタイムスタンプを返す関数を宣言すると、その型情報が関数の意味を記述していることになる。

**抽象化またはモジュール化**
> 型によってプログラマは低レベルでの実装に煩わされずにより高レベルで考えることができるようになる。例えば文字列型によってプログラマは文字列を文字列として、単なるバイトの列ではないものとして考えることができる。また型によってプログラマは2つのサブシステム間のインタフェースを表現することができる。これはサブシステムの相互運用性に必要な定義を局所化し、それらのサブシステムが通信する際に起きる矛盾を防止する。

### まとめ

型システムを利用する事により

* 可読性
* 抽象化・モジュール性

が向上し、新たに

* 型検査
* 安全性

を手に入れる事ができるということですね。

型システムは軽量形式手法なのですが、[この国立情報学研究所の形式手法の資料](https://www.nii.ac.jp/TechReports/public_html/07-007J.pdf)に書かれている資料の以下の項目のメリットはある程度得られると考えます。

* 厳密な言語を用いることで仕様を明確化
* 記述中に隠れている不具合を開発早期に発見
    * [証明駆動開発](https://www.iij-ii.co.jp/activities/programming-coq/coqt8.html)をすれば、アルゴリズムがただしく動作するかを一時的な入力値を元に検証ではなく、証明ができますが、軽量形式手法である型システムの場合だと、そこまではできない
* テスティング(手動テスト含む)まで不具合を放っておかなくて済む

## 最後に

先日[TypeScript3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html)がリリースされました。
現在の[TypeScriptの型システムはチューリング完全](https://github.com/Microsoft/TypeScript/issues/14833)のようです。
TypeScriptの型システムはかなり柔軟でかなり深く、色々できます。

私の場合はこの柔軟な型システムに、発達したエコシステムを利用した型安全のある開発がしたいので、これからもJavaScriptのスーパーセットであるTypeScriptを使って行こうとおもいます。

![](https://1.bp.blogspot.com/-NLsQzRwOMfQ/VcMlH1DDRXI/AAAAAAAAwVA/EGmlRt4mDW4/s800/baseball_man5_blue.png)