TL;DR

スキーマに基づいて、データのデコードとエンコードを行う Effect の API 群。v3.10 より前は @effect/schema という別のパッケージだったが、v3.10 から Effect 本体に入った。

仕組み

スキーマは Schema.Struct などで定義する。

const Pokemon = Schema.Struct({
  id: Schema.Number,
  order: Schema.Number,
  name: Schema.String,
  height: Schema.Number,
  weight: Schema.Number,
})

Schema.decodeUnknown に渡すと、unknown 型の値をスキーマの型にデコードする関数ができる。この関数は Effect<A, ParseError> を返す(下の例では Effect<Pokemon, ParseError>)。

const decodePokemon = Schema.decodeUnknown(Pokemon)

注意点

Schema.Struct は Opaque types を提供していないので、これで定義すると、IDE で成功時の型を確かめたときに、スキーマのすべてのプロパティが展開されて表示される。

これを避けるには、代わりに Schema.Class を使う。型パラメータにはクラス名と同じ名前を書き、1 つ目の引数に識別子(_tag の値)、2 つ目の引数にスキーマの形を渡す。クラスなので、メソッドも足せる。

class Pokemon extends Schema.Class<Pokemon>("Pokemon")({
  id: Schema.Number,
  order: Schema.Number,
  name: Schema.String,
  height: Schema.Number,
  weight: Schema.Number,
}) {
  public get formatHeight(): string {
    return `${this.height}cm`
  }
}

ただし Schema.Class が使えるのはオブジェクトのスキーマだけで、ユニオン型やプリミティブには使えない。

関連

出典