TypeScriptの勝利。それが実際に私たちにもたらしたもの。
もはやTypeScriptを使うべきかどうかで議論する人はいない。新規プロジェクトではデフォルトで使用される。論争は終わったのだ。
真の価値は、単にタイポ(打ち間違い)を見つけることだけではない。それよりもずっと大きなものだ。
関数のシグネチャはドキュメントとして機能する。それが古くなることはない。コードが変更されれば、コンパイラがビルドを失敗させる。
この関数を見てほしい:
function scheduleReminder(
userId: string,
at: Date,
channel: "email" | "push" | "sms",
): Promise<ReminderId>;
これをどう呼び出すべきか、正確にわかる。何が必要で、何を返すのかもわかる。channel は3つの特定の文字列のいずれかでなければならないこともわかる。
後で "slack" オプションを追加した場合、コンパイラがコードのあらゆる部分を更新するように強制する。コメントであれば、ただ形骸化し、嘘をつくことになるだろう。
型のないコードでは、フィールド名を変更するのは恐ろしい作業だ。文字列を検索して、あとは祈るしかない。TypeScriptなら、型を変更するだけでいい。コンパイラが壊れた箇所の「ToDoリスト」を提示してくれる。リファクタリングが安全になるのだ。
型はAIの助けにもなる。
AIモデルはJavaScriptではコードの形状を推測する。しかしTypeScriptでは、型が仕様となる。AIは何が許可されているかを理解できる。ミスは本番環境のクラッシュではなく、エラーとして現れる。
型はガードレールとして機能する。一行ずつ手動でチェックする代わりに、自信を持ってAIが生成したコードを利用できるようになる。
以下のルールに従って、より良い型を書こう:
• 多くのBooleanを使う代わりにUnion型を使う。「loading」 | 「error」 | 「ready」のようなステータスは、3つの個別のフラグよりも優れている。
• ドメイン型に名前をつける。意図を示すために type Cents = number のように使う。
• any を避ける。代わりに unknown を使い、型を絞り込む(narrowing)。
• 型推論を活用する。関数のシグネチャのような境界部分には型注釈を付けるが、それ以外は推論に任せる。
TypeScriptはコードベースを「強制された契約」の集合へと変えた。これらの契約によって、恐れを知らないリファクタリングと、信頼できるAIによる支援が可能になる。
私たちはバグを防ぐために型を使い始めた。そして、型が他のあらゆるものの基盤であるからこそ、使い続けているのだ。
Source: https://dev.to/parsajiravand/typescript-won-heres-what-that-actually-bought-us-53lo
