ブログサイト

Next.js App Routerを使用した静的ブログサイト

TypeScript開発で役立つ実用的なTips

TypeScript開発で役立つ実用的なTips

TypeScriptを使用した開発において、知っておくと便利なTipsとテクニックをまとめました。

1. Union型を活用した型安全性の向上

Union型を使用することで、複数の型を受け付ける柔軟な関数を型安全に作成できます。

type Status = 'loading' | 'success' | 'error'

function getStatusMessage(status: Status): string {
  switch (status) {
    case 'loading':
      return '読み込み中...'
    case 'success':
      return '完了しました'
    case 'error':
      return 'エラーが発生しました'
    default:
      // TypeScriptが全てのケースをチェック
      const _exhaustive: never = status
      return _exhaustive
  }
}

2. オプショナルチェーニングとNullish Coalescing

?.??演算子を組み合わせることで、安全にオプショナルなプロパティにアクセスできます。

interface User {
  name: string
  profile?: {
    bio?: string
    avatar?: string
  }
}

function getUserBio(user: User): string {
  return user.profile?.bio ?? 'プロフィールが設定されていません'
}

3. Mapped Typesで型の変換

既存の型から新しい型を生成する際に、Mapped Typesが便利です。

type User = {
  id: number
  name: string
  email: string
}

// すべてのプロパティをオプショナルにする
type PartialUser = Partial<User>

// すべてのプロパティを読み取り専用にする
type ReadonlyUser = Readonly<User>

// 特定のプロパティのみを抽出
type UserContact = Pick<User, 'name' | 'email'>

4. Generic Constraintsで型を制限

ジェネリック型に制約を加えることで、より安全で使いやすいAPIを作成できます。

interface Identifiable {
  id: string | number
}

function updateEntity<T extends Identifiable>(
  entity: T,
  updates: Partial<T>
): T {
  return { ...entity, ...updates }
}

const user = { id: 1, name: 'John', email: 'john@example.com' }
const updatedUser = updateEntity(user, { name: 'Jane' })

5. 型ガードで実行時型チェック

実行時に型を安全にチェックするための型ガード関数を作成しましょう。

function isString(value: unknown): value is string {
  return typeof value === 'string'
}

function processValue(value: unknown) {
  if (isString(value)) {
    // この時点でvalueはstring型として扱われる
    console.log(value.toUpperCase())
  }
}

まとめ

これらのTipsを活用することで、より型安全で保守性の高いTypeScriptコードを書くことができます。TypeScriptの型システムを理解し、適切に活用することが重要です。