📝

Associated Typed EnumをJSONで表現する

2022/01/14に公開

TL;DR

  • TypeScriptのUnion Typeをトランスパイルした形と捉えると良い

課題

  • 異なるデータ型をひとつの変数で扱いたい
  • 静的型付け言語を使いたい

という場合にはSwiftではenum, TypeScriptではUnion Typeなどを用います。
このデータを型のないフォーマットで受け渡す必要があるときに、どのような形式に直すとデータ構造が明瞭なまま、つまりコメント等の追加説明不要で変換できるかということを考えます。

解決法

# 定義
enum {
  case hoge(t: T)
  case fuga(s: S, t: T)
  case pake
}

こういったデータ型に対して、JSONでは

# JSON
{
  type: "hoge" | "fuga" | "pake"
  t?: T # key? はkeyの存在がoptionalであること
  s?: S
}

# 例:
[
  {
    type: "hoge"
    t: xxxx
  },
  {
    type: "fuga"
    t: yyyy
    s: zzzz
  }
]

このような形式に変換します。
これはTypeScriptのUnion Typeをトランスパイルした構造そのもので、もっとも情報量の冗長が少なく、かつデータ構造が明瞭であると思います。

Discussion