البداية · فصل ٢

الحل — TypeScript والـ Zod

Zod · z.infer · unknown · parse · ZodError · HTTP error
🎯 الهدف: تعرّف الـ schema مرة واحدة، وتشتق منها النوع، وتراجع الـ response بـ parse قبل ما الداتا تطلع من الـ API layer.

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>;
الـ schema تتعرّف مرة واحدة، والنوع يتشتق منها بـ 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.