3秒でわかる
値をどの型として扱うかを明示し直す操作。整数どうしの割り算で小数が消える、といった型の食い違いによる計算間違いを防ぐために使います。
もう少し詳しく
どういうものか
キャストは、ある型の値を別の型として扱うよう指示する操作です。Java や C では (int) のように型名を括弧で書いて明示します。整数から浮動小数点数へ、あるいは親クラス型の参照を子クラス型へ、といった変換で使います。
言語によっては変換そのものを関数で行い、キャストという語は「型の見方を変えるだけで中身は変換しない」場合に限る、という使い分けもあります。TypeScript の as はこの後者で、実行時には何も起きません。
なぜ必要か
型が合わないまま計算すると、意図しない結果になります。整数どうしの割り算が小数点以下を切り捨てるのはその代表で、割合の計算が常に 0 になるといった不具合につながります。片方を実数として扱い直すことで、期待する計算結果が得られます。
具体例
int total = 7;
int count = 2;
System.out.println(total / count); // 3 切り捨てられる
System.out.println((double) total / count); // 3.5 片方を実数にする
double d = 3.9;
System.out.println((int) d); // 3 切り捨て。四捨五入ではない
Object o = "こんにちは";
String s = (String) o; // <a href="/glossary/reference-type" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">参照型</a>のキャスト
System.out.println(s.length()); // 5つまずきやすいところ
大きい型から小さい型へ落とすときに値が壊れます。(int) で小数を切ると端数が消え、(byte) で大きな整数を切ると上位のビットが捨てられて符号まで変わることがあります。丸めたいなら切り捨てではなく丸めの関数を使います。
キャストを書く位置も間違えやすい点です。(double)(total / count) は整数の割り算が終わったあとに変換するので 3.0 のままです。割る前に片方を変換する必要があります。
参照型のキャストは、実際の中身が違えば実行時に例外になります。TypeScript の as はさらに危険で、コンパイラの文句を黙らせるだけで実行時の保証は何もありません。型が合っている確信が無い場所で使うと、undefined を触って落ちます。
覚え方
キャストは「中身を作り変える」のではなく「どの型として見るかを宣言する」操作です。見方を変えても入りきらないものは、こぼれます。