3秒でわかる
値の型が合わない操作を、実行する前の段階で検出できる状態のこと。TypeScript の型検査は、この状態を作るために働きます。
もう少し詳しく
どういうものか
型が合わない操作を、プログラムを動かす前に検出できる性質のこと。数値を期待する引数に文字列を渡す、存在しないプロパティを読む、null かもしれない値をそのまま使う、といった誤りをコンパイルや検査の段階で弾ける状態を指す。
TypeScript は JavaScript に型注釈を足し、コンパイル時に検査を行う。検査を通ったあと型情報は消え、実行時には素の JavaScript として動く。つまり守ってくれるのは書いている最中と検査の時点までになる。
なぜ必要か
型が合わない誤りは、動かしてみるまで気づかない場合、本番環境で初めて表面化する。user.profile.name の profile が undefined だったときのエラーは、その画面を開いた利用者にだけ起きる。型検査があれば、profile が undefined になりうると分かった時点で編集画面に赤い波線が出る。
副次的な効果として、エディタの補完が正確になる。オブジェクトのキー名を思い出す必要が減り、名前の変更もエディタの一括置換で安全に通る。
具体例
type User = {
id: number;
name: string;
email?: string; // 無いかもしれない
};
function greet(user: User): string {
// user.emial; 誤字はここで検出される
// return user.email.toUpperCase(); email が undefined の可能性で弾かれる
if (user.email) {
return `${user.name} ${user.email.toUpperCase()}`;
}
return user.name;
}
greet({ id: 1, name: "山田" }); // OK
// greet({ id: "1", name: "山田" }); id の型が違うので検査で落ちるつまずきやすいところ
any を置いて警告を消す対処が、いちばん多い抜け道になる。any を通った値はそこから先いっさい検査されないため、型注釈がついているのに壊れるという最悪の状態になる。型が分からない場合は unknown を使い、絞り込んでから触る。
外部から来るデータも穴になる。await res.json() の戻りに型を書いても、それは「そう来るはずだ」という宣言にすぎず、実際の中身は検査されない。API の応答は zod のような検証ライブラリで実行時に確かめる必要がある。
strictNullChecks を切っている設定にも注意がいる。この設定が無効だと、null や undefined がすべての型に紛れ込めてしまい、型安全の中心的な利点が失われる。
似た用語との違い
| 語 | 意味 |
|---|---|
| 静的型付け | 実行前に型を決める。TypeScript や Java |
| 動的型付け | 実行時に型が決まる。JavaScript や Python |
| 型推論 | 注釈が無くても文脈から型を決める仕組み |