A Small Zod Bug That Taught Me About Type Coercion
While working on FocusYar, my Next.js project, I had a confusing issue: a goal existed in the database, but the application couldn't retrieve it correctly.
The problem was a type mismatch.
I was working with an ID that arrived as a string, while my Zod schema expected a number.
Before
const id = "123"; The Fix
import { z } from "zod"; const schema = z.object({ id: z.coerce.number(), }); z.coerce.number() attempts to convert the input to a number before validation.
This is especially useful when handling URL parameters and query strings.
A More Strict Version
If the ID must be a positive integer, I can validate that requirement too:
const schema = z.object({ id: z.coerce.number().int().positive(), }); One important detail: coercion and validation are different things. Converting a value to a number doesn't automatically make it a valid ID.
My Takeaway
When debugging a problem, I shouldn't immediately assume the database or query is broken. I should inspect the data, check its type, and follow it through the application.
I'm learning to solve problems by understanding their causes instead of just fixing their symptoms.
typescript #zod #nextjs #beginners
原文:https://www.a8q9.cn/en/article/a-small-zod-bug-that-taught-me-about-type-coercion-8fda54.html