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・フォーム)から型を付けていくのが現実的です。