TypeScript والـ Zod شغلهم مختلف
- TypeScript: بيساعدك تكتب كود آمن، ويكتشف أخطاء الأنواع أثناء التطوير.
- Zod: بيفحص الداتا الفعلية وقت التشغيل ويتأكد إنها مطابقة للـ schema.
التثبيت:
terminal
pnpm add zodالـ schema والنوع من مكان واحد
users.schema.ts
import { z } from "zod";export const userSchema = z.object({ id: z.number(), name: z.string(), email: z.string().email(),});export type User = z.infer<typeof userSchema>;z.infer، من غير ما تكتب النوع مرتين.
الـ schema في الـ API layer
users.api.ts
export const getUser = async (): Promise<User> => { const response = await fetch("/api/user"); if (!response.ok) { throw new Error("Failed to fetch user"); } const data: unknown = await response.json(); return userSchema.parse(data);};دلوقتي عندنا ٣ احتمالات:
- الـ API رجعت داتا صحيحة: الدالة بترجع
User. - الـ API رجعت داتا غير مطابقة:
parse()بترميZodError. - الـ HTTP request فشل: بنرمي خطأ خاص بالـ request.
خلّصت الفصل لما
🧠 اختبر نفسك
١) ليه z.infer بدل ما تكتب type User لوحده؟
عشان النوع يطلع من نفس الـ schema، ومتكتبش التعريف مرتين.
٢) ليه const data: unknown مش any؟
عشان متعاملش مع الداتا على إنها آمنة قبل الـ validation.
٣) parse بتعمل إيه لو الداتا مش مطابقة؟
بترمي
ZodError.