JSONからZodスキーマのNullableフィールドを扱う

JSONでnullになりうるフィールドに.nullable()を使ったZodスキーマの生成方法を学びます。Zodにおけるnullableとoptionalの違いを理解。

Nested Objects

詳細な説明

ZodのNullableフィールド

JSONは明示的に値としてnullをサポートしています。Zodの.nullable()修飾子は、フィールドが基本型に加えてnullを受け入れることを許可します。

JSON例

{
  "id": 1,
  "name": "Alice",
  "email": "alice@example.com",
  "deletedAt": null,
  "lastLoginAt": null,
  "avatar": null
}

生成されるZodスキーマ(nullableトグル使用)

import { z } from "zod";

const userSchema = z.object({
  id: z.number().int().nullable(),
  name: z.string().nullable(),
  email: z.string().nullable(),
  deletedAt: z.null().nullable(),
  lastLoginAt: z.null().nullable(),
  avatar: z.null().nullable(),
});

type User = z.infer<typeof userSchema>;

実践的なパターン:Nullable日付

APIの一般的なパターンとして、まだ設定されていない場合にnullになる日付フィールドがあります:

const taskSchema = z.object({
  id: z.number(),
  title: z.string(),
  createdAt: z.string(),
  completedAt: z.string().nullable(), // 完了していない場合はnull
  deletedAt: z.string().nullable(),   // 削除されていない場合はnull
});

nullable() vs null()

  • z.null()は値nullのみを受け入れます。
  • z.string().nullable()は文字列またはnullを受け入れます。
  • この区別は、サンプルでは常にnullだが本番環境では文字列になりうるフィールドに重要です。

.optional()との組み合わせ

// フィールド:string、null、または完全に欠如可能
z.string().nullable().optional()

// フィールド:stringまたは欠如(ただしnullは不可)
z.string().optional()

// フィールド:stringまたはnull(ただし存在必須)
z.string().nullable()

Nullishの省略形

Zodは.nullable().optional()の省略形として.nullish()を提供します:

// これらは同等:
z.string().nullable().optional()
z.string().nullish()

フィールドがnull、undefined、または基本型のいずれかになりうる場合に.nullish()を使用します。これはSQLデータベースでカラムがNULLになり得、ORMクエリが選択されていないフィールドを省略する可能性がある一般的なパターンです。

ユースケース

データベースがユーザーレコードを返し、ソフトデリートされた行がnullでないdeletedAtタイムスタンプを持つ場合に、アクティブ(null)と削除済み(string)の両方の状態を正しく検証するスキーマが必要な場合に使用します。

試してみる — JSON to Zod Schema

フルツールを開く