3秒でわかる
変数や引数や戻り値がどんな型なのかをコードに書き添える記法。実行する前に矛盾を見つけ、エディタの補完を効かせるために使います。
もう少し詳しく
どういうものか
型注釈は、この変数には文字列が入る、この関数は数値を返す、といった型の情報をソースコードへ書き添える記法です。TypeScriptでは変数名の後ろに型を書き、Pythonでは同じ位置に書いた上で戻り値を矢印で示します。書いた情報はコンパイラや型チェッカが読み、実際の使われ方と矛盾していないかを実行前に確かめます。
なぜ必要か
型が無いと、間違いが見つかるのはその行を実行したときです。エラー処理の分岐など、めったに通らない経路に潜んだ取り違えは、本番で初めて表に出ます。型注釈があれば、保存した瞬間に矛盾が指摘されます。もうひとつの効き目は補完です。引数の型が分かっていればエディタが使えるメソッドを列挙できるので、ドキュメントを開く回数が目に見えて減ります。関数の使い方を説明するコメントとしても、本文より正確で古びにくい形になります。
具体例
// TypeScript
type User = { id: number; name: string; email?: string };
function greet(user: User, times: number): string {
return Array.from({ length: times }, () => `こんにちは、${user.name}さん`).join("\n");
}
greet({ id: 1, name: "田中" }, "3"); // 実行前にエラーになる# Python
def total_price(prices: list[int], tax_rate: float = 0.1) -> int:
return round(sum(prices) * (1 + tax_rate))つまずきやすいところ
Pythonの型注釈は実行時に検査されないため、書いてあるからといって守られるわけではありません。実際に確かめるには mypy や pyright を別途走らせます。TypeScriptで多いのは、面倒になった箇所へ any を置く逃げ方です。any を1つ挟むと、そこから先の呼び出しは全部チェックの対象から外れます。分からない値には unknown を使い、絞り込んでから触ります。もうひとつは、null や undefined が入りうる値を型に反映し忘れる誤りで、実行時エラーの多くはここに集中します。
似た用語との違い
| 語 | 意味 |
|---|---|
| 型注釈 | 型を人が明示的に書くこと |
| 型推論 | 書かなくても処理系が型を判断すること |
| 型定義 | 型そのものに名前を付けて宣言すること |
初期値から分かる型まで全部書く必要はありません。関数の引数と戻り値を書き、中の変数は推論に任せるのが読みやすい配分です。