Search parameters and path parameters are technically strings. But, I know they should be numbers. It’s fine. Let’s just make sure that they coerce into numbers.
const TaskSchema = z.object({
id: z.coerce.number().int(),
title: z.string(),
description: z.string().optional(),
completed: z.coerce.boolean(),
});
const TaskParamsSchema = TaskSchema.pick({ id: true });
We can use it like this.
const { id } = TaskParamsSchema.parse(req.params);
Search Parameters
The same basic idea works for search parameters.
const TaskQuerySchema = z.object({
completed: z.coerce.boolean().optional(),
});
Or, I might do something like this:
const TaskQuerySchema = TaskSchema.pick({ completed: true }).partial();
And now we can make sure our queries make sense.