Next.js と TypeScript で、Enum 型を学ぶ

TwitterFacebookHatena

TL;DR

このページでは、Next.js と TypeScript を用いた Enum 型の実装方法について解説します。初心者から上級者まで、Enum 型の理解を深めるための情報を提供します。

開発環境 バージョン
Next.js 13.4.3
TypeScript 5.0.4
Emotion 11.11.0
React 18.2.0

Enum 型とは何か?

Enum(enumerated)型は、名前付きの定数の集合を定義するための特殊な型です。主に一連の関連する値を一緒にグループ化する際に使われます。Enum 型を用いると、プログラム全体で一貫した値を保証でき、誤って期待外の値を割り当てることを防ぐことができます。

Enum 型は、英語の "Enumeration"(列挙)から来ています。これは、プログラム内で使用する一連の関連した値を名前で列挙(リストアップ)するための特殊な型です。それぞれの値は、プログラムの中で一意(他と重ならない)であることが保証されています。

例えば、Enum 型は「モンスターカード」のようなものです。例えば、"ファイヤードラゴン"、"ウォーターナイト"、"アースウィザード" など、それぞれのモンスターカードは一意の名前を持っていますよね。そして、これらのモンスターカードの集まりが Enum 型に相当します。つまり、Enum 型を使うと、それぞれ異なる特性を持つモンスターカードを一つのグループとして管理することができます。

この Enum 型が生まれた理由は、コードの安全性と可読性を向上させるためです。Enum 型を使うことで、プログラム内で一貫した値を使うことを強制でき、予期せぬエラーを防ぐことができます。また、Enum 型は名前がつけられているため、何を表しているのかが直感的にわかりやすくなります。

以上のように、Enum 型はコードを安全で読みやすくするために、とても便利な機能です。

例として、以下にフルーツの Enum 型を定義した TypeScript コードを見てみましょう。

enum Fruit {
  Apple = 'APPLE',
  Banana = 'BANANA',
  Orange = 'ORANGE',
}

console.log(Fruit.Apple) // Output: 'APPLE'

Next.js で、Enum 型を実装

具体的に、Enum 型を Next.js と TypeScript でどのように活用するか見てみましょう。以下のコードは、フルーツの色を判定する Enum を使ったコンポーネントの実装です。

ファイル名: components/FruitColor.tsx

import React from 'react'

enum Fruit {
  Apple = 'APPLE',
  Banana = 'BANANA',
  Orange = 'ORANGE',
}

type FruitColorProps = {
  fruit: Fruit
}

const FruitColor = ({ fruit }: FruitColorProps) => {
  let color: string

  switch (fruit) {
    case Fruit.Apple:
      color = 'red'
      break
    case Fruit.Banana:
      color = 'yellow'
      break
    case Fruit.Orange:
      color = 'orange'
      break
    default:
      color = 'unknown'
      break
  }

  return (
    <div>
      The color of the {fruit} is {color}.
    </div>
  )
}

export default FruitColor

このコードでは、Enum 型 Fruit が定義されており、それぞれのフルーツにそれぞれの色を割り当てています。FruitColor コンポーネントは Fruit 型の fruit プロパティを受け取り、それに応じて色を判定しています。

Enum 型の活用法

Enum 型を使うことで、プログラムの安全性と可読性を向上させることができます。具体的な応用例として、API のレスポンスステータスを管理するための Enum 型を見てみましょう。

enum HttpStatus {
  OK = 200,
  BadRequest = 400,
  Unauthorized = 401,
  InternalServerError = 500,
}

type ApiResponseProps = {
  status: HttpStatus
}

const ApiResponse = ({ status }: ApiResponseProps) => {
  let message: string

  switch (status) {
    case HttpStatus.OK:
      message = 'The request was successful.'
      break
    case HttpStatus.BadRequest:
      message = 'The request was invalid.'
      break
    case HttpStatus.Unauthorized:
      message = 'You are not authorized to perform this action.'
      break
    case HttpStatus.InternalServerError:
      message = 'Something went wrong on our end.'
      break
    default:
      message = 'An unknown error has occurred.'
      break
  }

  return <div>{message}</div>
}

export default ApiResponse

このコードでは、HTTP ステータスコードを Enum 型で定義し、それに応じてメッセージを制御しています。これにより、ステータスコードが一貫した値を持つことを保証し、誤ったステータスコードを割り当てるリスクを軽減できます。

Emotion を使ったスタイリング

Enum 型を使ったスタイリングも可能です。Emotion を使うと、Enum 型で定義したフルーツごとに異なるスタイルを適用することができます。

/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react'
import React from 'react'

enum Fruit {
  Apple = 'APPLE',
  Banana = 'BANANA',
  Orange = 'ORANGE',
}

type FruitColorProps = {
  fruit: Fruit
}

const FruitColor = ({ fruit }: FruitColorProps) => {
  let color: string

  switch (fruit) {
    case Fruit.Apple:
      color = 'red'
      break
    case Fruit.Banana:
      color = 'yellow'
      break
    case Fruit.Orange:
      color = 'orange'
      break
    default:
      color = 'black'
      break
  }

  return (
    <div
      css={css`
        color: ${color};
      `}
    >
      The color of the {fruit} is {color}.
    </div>
  )
}

export default FruitColor

このコードでは、FruitColor コンポーネントが Fruit 型の fruit プロパティを受け取り、それに応じて色を判定し、その色をテキストの色に適用しています。Emotion の css プロパティを使って、動的にスタイルを適用することが可能です。

Next.js と TypeScript で、Enum 型を学ぶ