TypeScriptのベストプラクティスを見てみる #2

github.com TypeScriptのベストプラクティスを見てみようの第2弾です。

6. Object型は避けよう!

Object型を使うのはあんまりオススメされていません。型の安全性があまり確保できないんです。代わりに、特定の型やインターフェースを使うことで、型の安全性と明確さを確保しましょう。こうすることで、早い段階でエラーを発見できて、コードの予測可能性も上がります。

7. for-inよりfor-ofを使おう!

配列を繰り返し処理するときは、for-inループよりもfor-ofループを使うのがベター。for-ofループは、反復可能オブジェクト専用に設計されていて、パフォーマンスと可読性に優れているんですよ。プロパティの反復処理に関連する落とし穴も回避できちゃいます。

例えば、こんな感じで配列をfor-ofで処理できます:

const numbers = [1, 2, 3, 4, 5];

for (const num of numbers) {
  console.log(num);
}

for-inだとインデックスが文字列で取得されちゃうので、for-ofを使うのがオススメ。

8. T[]よりArray<T>を使おう!

Array<T>構文を使うほうが、柔軟性があって一貫性も保てるんですよね。特に複雑な型を扱うときに威力を発揮します。TypeScriptの他のジェネリック型とも整合性がいいので、可読性とメンテナンス性も上がるってわけです。

type User = {
  name: string;
  age: number;
};

const users: Array<User> = [
  { name: "Alice", age: 25 },
  { name: "Bob", age: 30 },
];

こんな感じで、Array<T>を使えば型の情報がしっかり保持されるので、安心して配列を扱えます。

9. 不変性にはreadonlyを使おう!

readonly修飾子を使えば、オブジェクトのプロパティを初期化後に変更できなくなるんです。この方法で不変性を確保することで、より安全で予測可能なコードになるんですよ。意図しない副作用を防げるってわけです。

10. ユニオン型とインターセクション型を活用しよう!

ユニオン型とインターセクション型を使えば、柔軟で強力な型定義ができちゃいます。型の組み合わせと拡張が可能になるので、型宣言の制御力と表現力がアップするんですよね。このフレキシビリティのおかげで、コードの堅牢性と再利用性が高まるってもんです。

例えば、ユニオン型を使ってこんな風に型を定義できます:

type Status = "active" | "inactive" | "pending";

function updateStatus(status: Status) {
  // ...
}

updateStatus("active"); // OK
updateStatus("invalid"); // error: Argument of type '"invalid"' is not assignable to parameter of type 'Status'.

こんな感じで、ユニオン型を使えば特定の値だけを受け入れる型が作れるので、より正確でエラーが起きにくいコードが書けるようになります。