フロント側の実装で「enum をそのまま表示に使おうとすると辛い」ケースに遭遇したので雑談会で共有した。

1. 数字の選択肢のケース

  • 配送頻度の間隔を選択させるフォーム用の選択肢
  • 「1, 3, 6」のどれか
enum FrequencyMonthEnum {
  """
  6ヶ月
  """
  half_year

  """
  1ヶ月
  """
  month

  """
  3ヶ月
  """
  quarter
}

辛いポイント

  • フロント側で以下の変換を往復する必要がある
    • enum → 対応する数字(昇順に並び替え)→ 対応する日本語(選択肢用)

2. 日本語と対応させる必要があるケース

  • 検索条件でカテゴリーを指定する時

辛いポイント

  • 結局、選択肢の enum と、対応する日本語で型を用意する必要がある
  • 毎回冗長に書かなければならない
const categoryConditions: { id: CategoryEnum; label: string }[] = [
  { id: CategoryEnum.Food, label: "フード" },
  { id: CategoryEnum.Snack, label: "スナック" },
  { id: CategoryEnum.Drink, label: "ドリンク" },
];

雑談会で出た話

雑談会で上記を相談したところ、次のような意見をいただけた。

enum ではなくオブジェクトの配列で渡すようにする

  • enum だと変更の度にサーバー・フロントの両方を変更しなければならない
  • 例)
type FrequencyMonthCondition {
  conditions: [FrequencyMonth!]!
}

type FrequencyMonth {
  id: ID!
  labelJa: string!
}

"""
取得イメージ
[
  { id: 'HalfYear', labelJa: '6ヶ月'}
  { id: 'Month', labelJa: '1ヶ月'}
  { id: 'Quater', labelJa: '3ヶ月'}
]
"""

受け渡すデータと対応する、翻訳用データを用意する

  • 「データ上の値」と、「それをどう表示するか」の話なので、多言語対応と似ているかも
  • トップ画面ロード時に各データと対応する翻訳用のデータセットを予め先にフロントに渡す
  • キーとなる値が重複しないような配慮が必要になりそう
  • 例)
    • 渡されるデータ
enum FrequencyMonthEnum {
  halfYear
  month
  quarter
}
  • 別に用意する翻訳用オブジェクト
const locales = [
  {
    language: 'jp',
    messages: {
     // ここに並列に他のキーも入るため、グローバルで一意にする必要がある
      halfYear: '6ヶ月'
      month: '1ヶ月'
      quarter: '3ヶ月'
    }
  },
]