Before: `as any` escape hatch
1// No type safety on webhook payload
2const payload = req.body as any;
3
4// Runtime crash if field missing
5const email = payload.contact.email;
6const name = payload.contact.name;
7const deal = payload.deal.value;
8
9// Supabase query with no generics
10const { data } = await supabase
11 .from('contacts')
12 .select('*');
13// data is any[] -- no autocomplete
Compiler cannot catch missing fields or wrong types
After: Zod schema + proper types
1const WebhookSchema = z.object({
2 contact: z.object({
3 email: z.string().email(),
4 name: z.string().min(1),
5 }),
6 deal: z.object({
7 value: z.number().positive(),
8 }).optional(),
9});
10
11const result = WebhookSchema.safeParse(
12 req.body
13); // Typed + validated at runtime
Compile-time types + runtime validation = zero escape hatches