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