TypeScriptは「書ければいい」から「型で守る」に踏み込むと真価を発揮します。型はドキュメントであり、テストの一部でもあります。
anyではなくunknownから始める
外部入力はまずunknownで受け、絞り込んでから使います。anyは型チェックを無効化し、TypeScriptの恩恵を捨てる行為です。
ユニオンと網羅チェック
type Status = "open" | "closed" | "draft";
function label(s: Status) {
switch (s) {
case "open": return "公開";
case "closed": return "終了";
case "draft": return "下書き";
default: {
const _exhaustive: never = s; // 追加漏れをコンパイルエラーに
return _exhaustive;
}
}
}
状態を「あり得ない形にできない」型にする
「ローディング中なのにデータもある」といった矛盾状態を、判別可能ユニオンで表現不可能にします。これがバグを設計で潰すということです。
段階的導入でよい
既存JSプロジェクトはstrictを少しずつ有効化し、境界(API・フォーム)から型を付けていくのが現実的です。