本日は、JavaScriptにおけるフロントエンド開発者にとって不可欠なTypeScriptについてご紹介します。
TypeScriptを学ぶには、JavaScriptにおける「型」やその他の基礎知識に詳しいことが重要です。
実際、多くのエンジニアは次のように言います。
「JavaScriptの知識を基にしてTypeScriptに移行しましょう」
TypeScript公式も同様のアドバイスをしていますので、JavaScriptに詳しくない方にとっては、この記事を読んでも理解するのが難しいかもしれませんのでご了承ください。
今後、多くの用語が登場しますので、お気をつけください。
この記事では、TypeScriptの利点を紹介し、初心者から上級者まで、誰もがこの言語に興味を持つように刺激します。
TypeScriptとは?
TypeScriptは、Microsoftによって開発および保守されているプログラミング言語であり、オープンソースです。
現在、推定で世界に存在するウェブサイトの数は非常に多く、正確な数は把握できませんが、世界には約18億のウェブサイトが存在すると推定されており、そのうち95%がJavaScriptを占めていると言われております。
GitHubのOctoverse Reportによれば、JavaScriptは世界で最も広く使われている言語です。
JavaScriptプログラマーがよく犯すエラーの中で最も一般的なのは、型エラーです。
これは、単純なタイプミスやライブラリのAPIの理解不足、実行時の動作に関する誤った仮定など、さまざまな要因によって引き起こされます。
TypeScriptの目標は、JavaScriptプログラムにおける静的型チェックを可能にすることです。
TypeScriptは、JavaScriptの上位互換言語であり、JavaScriptにコンパイルされる静的型システムを備えています。
つまり、TypeScriptはJavaScriptの機能を拡張した言語と言えます。
ただし、注意点として、TypeScriptはJavaScriptのスーパーセットではなく、一部の機能が追加された別の言語です。
TypeScriptのコードはJavaScriptのコードとしても有効であり、既存のJavaScriptプロジェクトに簡単に統合することができます。
これだけでは理解しづらいかもしれませんので、以下で具体的に説明します。
コンパイル
TypeScriptは、JavaScriptの静的型付け版であり、コードを機械語に直接変換するのではなく、JavaScriptに変換するプロセスを経て実行されます。
ブラウザ上でTypeScriptで書かれたコードを実行するには、まずTypeScriptをJavaScriptに変換する必要があります。
なぜなら、ブラウザはJavaScriptのみを理解できるためです。
JavaScriptにはバージョンがあり、毎年新しいバージョンがリリースされています(例: ES5、ES2015(ES6)、ES2016(ES7)など)。
最新バージョンで書かれたJavaScriptコードは、古いバージョンのブラウザでは動作しないことがあります。
この問題を解決するために、TypeScriptコンパイラを使用します。
TypeScriptコンパイラは、TypeScriptコードを対応するJavaScriptコードに変換してくれます。
これにより、古いバージョンのブラウザでも実行可能なJavaScriptコードを生成することができます。
ブラウザベンダー(例: ChromeのV8エンジンやFirefoxのSpiderMonkey)は、ブラウザを開発しており、最新バージョンのJavaScriptの機能に対応させる責任があります。
ユーザーはブラウザをアップデートすることで、最新バージョンのJavaScriptの恩恵を受けることができます。
TypeScriptコンパイラを使用することで、開発者はTypeScriptコードをJavaScriptに変換し、あらゆるブラウザで実行可能なコードを生成できます。
TypeScriptコンパイラ(tsc)は、TypeScriptコードをJavaScriptに変換するためのコマンドラインツールであり、tsconfig.jsonファイルに基づいて動作します。
なお、JavaScriptをコンパイルする際にBabelコンパイラも利用することができますが、Babelは静的型チェック機能が組み込まれていないため、型チェックを行いながら変換する必要がある場合は、TypeScriptコンパイラ(tsc)を使用する必要があります。
静的型システム
TypeScriptがJavaScriptへ変換される前に、開発者は「型での検査」を行います。
つまり、TypeScriptではコード記述時に静的な型チェックが行われます。
この型チェックは、変数や関数の型が正しいかどうかを確認することで、バグの可能性を減らすことを目的としています。
一連の厳しいルールを持つこのシステムは、「静的型システム」と呼ばれています。
なお、TypeScriptはJavaScriptへの変換時には型情報を削除し、純粋なJavaScriptコードに変換されます。
したがって、実際に実行される際には型情報は利用されません。
型の違いについて
静的型付けと動的型付けにはいくつかの違いがあります。
静的型付けでは、変数や関数に事前に型を定義します。
これにより、TypeScriptコンパイラ(tsc)はコードを実行する前に型の整合性を検査します。
JavaScript自体も元々型が存在しますが、静的型付けは変数と値の関連付けを強制します。
一方、JavaScriptはブラウザエンジン内部で一部の型検査が行われますが、より弱い型付けとなっており、明示的な型指定は必須ではありません。
動的型付けは、変数や関数の型が実行時に決定される方式です。
JavaScriptは動的かつ弱い型付け言語であり、プログラムを記述する際に型に関する制約がほとんどありません。変数や関数がどのような値を保持するかは実行時に決まるため、静的な型管理はありません。
TypeScriptはJavaScriptに型を追加した言語ですが、単純にJavaScriptの上位互換ではありません。
TypeScriptはJavaScriptの構文に準拠しており、JavaScriptで書かれたコードもTypeScriptで書くことができます。
TypeScriptでは、JavaScriptに元々ある型(文字列型や数値型など)をサポートしています。さらに、すべてのプリミティブ型とオブジェクト型の型チェックをサポートしています。
したがって、静的型付けと動的型付けは、型の管理方法や制約の度合いにおいて異なります。TypeScriptはJavaScriptの型をサポートしながら、より厳密な型管理を提供します。
型の定義
TypeScriptでは、コードを記述する際に型チェックを通過できるようにする必要があります。
例えば、JavaScriptでは以下のようなコードは問題ありません。
let value = 5; value = "hello";
しかし、TypeScriptではこのような代入は禁止されています。
"hello"
は数値型に代入できないため、コンパイラはエラーを返します。
TypeScriptでは、変数の型や関数の戻り値など、さまざまな箇所で型チェックが行われます。
型を指定するには、変数名の後にコロン(:)を付けて適切な型を記述します。たとえば、次のコードでは、value変数の型をbooleanと指定しています。
let value: boolean = true;
(※本来はconstを使用することを推奨しますが、この例では敢えてletを使用しています。)
TypeScriptでは、ほとんどの場合において型注釈を明示的に指定することができますが、型推論という機能もあります。
たとえば、次のコードでは、value変数にtrueという値が代入されているため、TypeScriptは自動的にboolean型と推測します。
let value = true;
明示的な型注釈を必要としない場合は、型推論を利用することができます。ただし、型推論ができない場合は型注釈を使用して型を明示的に指定することが推奨されます。
ほとんどのエンジニア、特にプログラマーは値を見ればその型が分かることが多いです。
また、Visual Studio Codeなどのエディタを使用している場合は、値にカーソルを合わせることで型を確認することもできます。
TypeScriptではさまざまなな型がサポートされています。
TypeScriptでの主な型は以下になります。
Boolean型
Number型
String型
Array型
Tuple型
Enum型
Any型
Union型
Literal型
Unknown型
Void型
Never型
NullまたはUndefined型
Object型
これらの型の解説は、別途記事に致します。
最後に
TypeScriptの最大の利点の一つは、JavaScriptの拡張として機能することです。
つまり、既存のJavaScriptコードをそのまま使用しながら、型システムを導入することができます。
これにより、開発者はコードの品質を向上させ、バグを減らすことができます。静的型付けによって、変数の型を宣言し、関数の引数や戻り値の型を厳密に定義することができます。これにより、コンパイル時にエラーを検出することができるため、実行時エラーを減らすことができます。
静的型付けと動的型付けの違いは、コードが実行されるタイミングで型のチェックが行われるかどうかです。
動的型付けの言語では、変数の型が実行時に決定されます。これに対して、静的型付けの言語では、コンパイル時に型のチェックが行われます。静的型付けによって、開発者はコンパイルエラーを修正することでバグを防ぐことができます。
また、TypeScriptの静的型システムは、大規模なプロジェクトやチームでの協力開発に非常に役立ちます。
コードベースが成長するにつれて、関数やクラスのインターフェースを明示的に定義することにより、コードの理解やメンテナンスが容易になります。さらに、IDEやエディタは静的型情報を活用して、自動補完やエラーチェックのサポートを提供します。
初心者に対して、TypeScriptは学習コストが低く、扱いやすい言語です。JavaScriptの知識があれば、スムーズに移行することができます。
TypeScriptは、なぜ使用するのか、静的・動的型付けの違い、そして静的型システムについての疑問を解消するための魅力的な言語です。
TypeScriptユーザーであるかどうかに関係なく、あなたがこれをやってみたいという好奇心を刺激したことを願っております。
本日は以上となります。
最後まで読んで頂きありがとうございました。
この記事が役に立ったら、ブックマークと共有をしていただけると幸いです。