3秒でわかる
変数や式の型を実行前に確定させる方式。型の食い違いをコンパイル時に見つけられるので、規模が大きいコードほど改修が安全になります。
もう少し詳しく
どういうものか
静的型付けは、変数・引数・戻り値がどんな種類の値を持つのかを、プログラムを動かす前に確定させる方式です。型は人間が書いた注釈から読み取られるか、後述する型推論でコンパイラが決めます。そのうえでコンパイラや型チェッカが全体を走査し、数値を期待している場所に文字列が渡っていないかを、1 行も実行しないうちに検査します。Java、C、Go、Rust、TypeScript がこの方式で、Python や JavaScript のように実行時まで型が決まらない動的型付けと対になります。
なぜ必要か
動的型付けでは、型の食い違いはその行が実行された瞬間に初めて表面化します。月末のバッチでしか通らない分岐や、エラー処理の中だけで呼ばれる関数にひそんだ型の間違いは、テストが通っていても本番で初めて落ちます。静的型付けなら、その分岐が一度も実行されなくてもコンパイラが検出します。もうひとつの効き目は改修時です。関数の引数を 1 つ増やしたとき、呼び出し元が 200 か所あっても、直し漏れは全部コンパイルエラーとして並びます。grep で探して目視で確認する作業が不要になります。
具体例
function calcTax(price: number, rate: number): number {
return Math.floor(price * rate);
}
calcTax(1000, 0.1);
// calcTax("1000", 0.1) はコンパイル時にエラーになる
// Argument of type 'string' is not assignable to parameter of type 'number'同じ内容を Python で書くと、文字列を渡しても関数の中で掛け算が行われるまでエラーになりません。掛け算にたどり着く前にログ出力や DB 書き込みがあると、途中まで処理が進んだ状態で落ちます。
似た用語との違い
| 用語 | 型が決まるとき | 代表的な言語 |
|---|---|---|
| 静的型付け | 実行前 | Java、Go、TypeScript |
| 動的型付け | 実行時 | Python、JavaScript、Ruby |
| 強い型付け | 暗黙変換をどこまで許すかの話で、静的か動的かとは別の軸 | Python は動的だが強い |
静的と強いは別物です。C は静的ですが暗黙変換を広く許すため弱い側に寄り、Python は動的ですが文字列と数値の加算を拒むため強い側に寄ります。
つまずきやすいところ
型注釈を書けば安全になると思い込むと足をすくわれます。TypeScript の型は JavaScript に変換される時点で消えるため、API のレスポンスのように外から来る値は、宣言した型と実物が違っていても実行時には素通りします。any や as で黙らせた箇所も同じです。外部から入る値は zod などで実際に検証するか、少なくとも unknown で受けて絞り込む必要があります。