編集

Zod 4.1がCodecs APIを導入、双方向データ変換をサポート

Zod 4.1が新しいz.codec() APIを導入した。従来の.transform()が一方向のみだったのに対し、双方向変換を可能にし、型安全性と柔軟性を向上させた。

基本的な使用例:

typescript
const stringToDate = z.codec(
  z.string(),      // 入力スキーマ:ISO文字列
  z.date(),        // 出力スキーマ:Dateオブジェクト
  {
    decode: str => new Date(str),        // 文字列 → Date
    encode: date => date.toISOString(),  // Date → 文字列
  }
);

// 双方向変換
stringToDate.decode("2024-01-15T10:30:00.000Z"); // Dateオブジェクト
stringToDate.encode(new Date()); // "2024-01-15T10:30:00.000Z"

Codecsの特徴:

  • 双方向変換:decode(入力→出力)とencode(出力→入力)の両方を定義可能
  • 型安全性:.decode()は厳密な型チェックを行い、.parse()よりも安全
  • 非同期対応:変換関数をasync/awaitで記述可能
  • 組み合わせ自由:他のZodスキーマと自由に組み合わせ可能

公式が次のようなコピー&ペーストで利用可能な標準的なコーデック実装をいくつか提供している。

typescript
const stringToBigInt = z.codec(z.string(), z.bigint(), {
  decode: str => BigInt(str),
  encode: bigint => bigint.toString(),
});

const jsonCodec = z.codec(z.string(), z.json(), {
  decode: jsonString => JSON.parse(jsonString),
  encode: value => JSON.stringify(value),
});

出展:Introducing Zod Codecs - Colin McDonnell

編集