shimotsu tech

Webフロントエンドエンジニア @ to-R inc.

Zod で空文字列を表現する

最近作っているアプリケーションで使っている Zod で、バリデーションに空文字列を指定する必要があったのでその方法をメモしておきます。

github.com

結論

結論から述べると、以下の書き方で実現できました。

const schema = z.object({,
  name: z.string().length(0),
})

ここで躓いたのが、バリデーションにおいて空文字列を許さない場合の書き方は z.string().noempty() と書けるのですが、そのシンプルな逆パターンの書き方がなかったことです。

単純に考えれば z.string().empty() とかでよさそうですが、そういったオプションは用意されておらず、いろいろ探した結果 z.string().length(0) で実現できることがわかりました。

ちょっと発展

少し発展して、バリデーションの条件として【URL(の形式)もしくは空文字列】というケースを考えてみます。

URL の指定は、デフォルトで設けられている z.string().url() を使って表現できます。さらにそのうえで、 2項の Union Types を表現できる .or() メソッドを利用し、以下のように書けます。

const schema = z.object({
  src: z.string().url().or(z.string().length(0)),
})

これで、URLもしくは空文字列のみを許可するスキーマを定義できました。