hono/zod-openapiで使えないschema

最近、hono/zod-openapiでの開発(移行)を体験したのでその際、schemaを単純移行できなかった部分のメモ。

input用schemaでunionが直接使えない。

z.union([
  z.object({key1: z.string()),
  z.object({keyA:string()})
])

みたいなschemaが利用できない。

回避方法としては、transformを利用する

z.object({ key1: z.string().optional(), keyA: z.string().optional()}).transform((data)=> z.union([
  z.object({key1: z.string()),
  z.object({keyA:string()})
]).parse(data))

z.fileがそのままでは使えない。(z.fileはunknown typeとなってしまう。)

回避方法としては、typeを手動設定する

z.file().openapi({type: "string", format: "binary"})

outputはparseしてくれない

inputはschemaでparseしてくれるが、outputはschemaでparseしてくれないので、outputがschema通りであることを保証するためには、outputもちゃんとparseする必要がある。