入力チェックのやり方のメモ
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 }