0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

effect-tsで入力チェック3 - Schema

Posted at

入力チェックのやり方のメモ
Schema.Unionにおいて取り扱い注意事項が存在する

effect-ts : Schema

前回

引数の順番で結果が変わるもの

Schema.Union は 引数の順番で結果が変わる
このような現象はpipe周りでも多く発生している気がする
本来はeither型を使用するなどして、使用者側で修正できるようにすべきだと思うが
そうではないため、暫定的な対処方法を記載しておく

import { describe, it } from 'vitest'
import { Schema, SchemaAST, Array, Order } from 'effect'

describe('effect-ts 入力検証 - Union', () => {
  const Member1 = Schema.Struct({
    a: Schema.String
  })

  const Member2 = Schema.Struct({
    a: Schema.String,
    b: Schema.Number
  })

  const Bad = Schema.Union(Member1, Member2)
  const Good = Schema.Union(Member2, Member1)

  const NotBad = Schema_Union(Member1, Member2)
  const Good2 = Schema_Union(Member2, Member1)

  function Schema_Union<
    Struct extends Schema.Struct<any>,
    Members extends SchemaAST.Members<Struct>
  >(...members: Members) {
    const ordered_members = Array.sort(
      members,
      Order.reverse(Order.mapInput(Order.number, (item: Struct) => Object.keys(item.fields).length))
    )

    const union = Schema.Union(...members)
    return Schema.Union(...ordered_members) as typeof union
  }

  it('サイトにあったやり方と改良したもの - decode', () => {
    const testData = {
      a: 'a',
      b: 12
    }
    console.log(Schema.decodeUnknownSync(Bad)(testData))
    console.log(Schema.decodeUnknownSync(Good)(testData))
    console.log('------')
    console.log(Schema.decodeUnknownSync(NotBad)(testData))
    console.log(Schema.decodeUnknownSync(Good2)(testData))
  })
})

実行結果

{ a: 'a' }
{ a: 'a', b: 12 }
------
{ a: 'a', b: 12 }
{ a: 'a', b: 12 }
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?