TL;DR

コンパイルするときに型の情報を取り除き、実行時のコードに型を残さないこと。TypeScript の型は、JavaScript に変換するときにすべて消える。

なぜ必要か

TypeScript のハンドブックによると、型アノテーションは JavaScript(ECMAScript)の一部ではないので、TypeScript をそのまま実行できるブラウザやランタイムはない。TypeScript のコンパイラは、TypeScript 固有のコードを取り除いたり変換したりして、実行できる JavaScript にする。TypeScript 固有のコードの多くは消され、型アノテーションも完全に消える。

仕組み

function greet(person: string, date: Date) を tsc でコンパイルすると、出力は function greet(person, date) になり、引数の型アノテーションがなくなる。そのため、型アノテーションがプログラムの実行時の振る舞いを変えることはない。型アサーションも同じく消えるので、実行時のチェックは行われない。

例

Effective TypeScript 第2版 ―型システムの力を最大限に引き出す83項目 によると、interface は型空間にしか存在せず、生成される JavaScript には残らないので、実行時に行われる instanceof のチェックには使えない。TS Playground で生成された JavaScript を見ると、型空間と値空間を見分ける直感を養える。

注意点

Effective TypeScript によると、生成されるコードは型に依存しないので、実行時に型をチェックすることも、型によって実行時の値や動作、パフォーマンスを変えることもできない。実行時に型で処理を分けたいなら、タグ付きユニオンのように、型の情報を値として持たせる必要がある。

関連

出典