リリース
Zod 4.4.0でついに`z.unknown()`がoptionalではなくなっていた
要点
- Zodを4.3.6以前から4.4.0以降に更新すると、z.object()のプロパティに指定したz.unknown()の挙動が変わる
- z.object({ foo: z.unknown() })のスキーマでは、空オブジェクト{}のsafeParseが失敗するようになったと報告されている
- リリースノートの注意点は手元のコードと無関係に見えたが、原因は4.4.0でのz.unknown()の変更だった
なぜ重要か
既存コードでz.object()内のz.unknown()を使っている場合、Zodを更新するだけでバリデーションが失敗する可能性がある。リリースノートだけでは原因に気づきにくい。
影響を受ける人
- Zodを4.3.6以前から4.4.0以降に更新する開発者
- z.object()内でz.unknown()を使っているコードの保守担当者
取るべき対応
- z.object()内のz.unknown()を使っている箇所を洗い出し、既存のバリデーションテストで挙動を確認する
- Zod 4.3.6
- Zod 4.4.0
- #Zod
- #TypeScript
- #バリデーション
- #破壊的変更
概要 Zodを4.3.6以前から4.4.0以降に更新したところ、これまで問題なく通っていたバリデーションが失敗するようになりました。リリースノートにあったいくつかの注意点はどれも手元のコードと無関係に見えましたが、実際にはこの4.4.0のリリースでz.object()のプロパティに指定したz.unknown()の挙動が変わっていたことが原因でした。 const schema = z.object({ foo: z.unknown(), }); schema.safeParse({}).success; // false //…