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