0Pricing
TypeScript Academy · درس

parse مقابل safeParse

تعاملوا مع نجاح التحقق وفشله بسلاسة

parse مقابل safeParse درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

طريقتان للتحقق

يوفّر Zod طريقتين للتحقق: parse، التي تطلق استثناءً عند وجود بيانات غير صالحة، وsafeParse، التي تُرجع كائن نتيجة بدلًا من ذلك.

import { z } from "zod";
const schema = z.string();
// schema.parse(x) throws on failure
// schema.safeParse(x) returns { success, ... }

تطلق parse استثناءً عند البيانات غير الصالحة

تُرجع parse القيمة التي جرى التحقق منها عند النجاح، وتطلق ZodError عند الفشل، مما يجعلها مناسبة عندما تكون البيانات غير الصالحة حالة استثنائية فعلًا.

import { z } from "zod";
const schema = z.number();
const ok = schema.parse(42); // 42
// schema.parse("nope"); // throws ZodError

التقاط أخطاء Parse

لفّوا parse داخل try/catch للتعامل مع الخطأ المُطلَق، وافحصوه لمعرفة تفاصيل ما فشل.

import { z } from "zod";
const schema = z.number();
try {
  schema.parse("nope");
} catch (err) {
  if (err instanceof z.ZodError) {
    console.log("Invalid:", err.issues.length);
  }
}

تُرجع safeParse نتيجة

لا تطلق safeParse استثناءً أبدًا. بل تُرجع كائنًا يحتوي على success: true وdata، أو على success: false وerror.

import { z } from "zod";
const schema = z.number();
const result = schema.safeParse("nope");
// result is { success: false, error: ZodError }

تضييق نوع النتيجة

النتيجة اتحاد مميَّز يعتمد على success. ويؤدي فحصه إلى تضييق النوع إلى data أو error.

import { z } from "zod";
const schema = z.object({ id: z.number() });
const result = schema.safeParse({ id: 1 });
if (result.success) {
  console.log(result.data.id); // typed
} else {
  console.log(result.error.issues);
}

متى تستخدمون parse

استخدموا parse عندما يكون الإدخال غير الصالح خطأً برمجيًا أو عندما ينبغي أن يوقف العملية، مثل قراءة إعدادات مطلوبة عند بدء التشغيل.

import { z } from "zod";
const configSchema = z.object({ port: z.number() });
const config = configSchema.parse({ port: 8080 });
// Fail fast if config is wrong.

متى تستخدمون safeParse

استخدموا safeParse عندما يكون الإدخال غير الصالح متوقعًا وتريدون التعامل معه بسلاسة، مثل التحقق من عمليات إرسال نماذج المستخدمين.

import { z } from "zod";
const formSchema = z.object({ email: z.string() });
const r = formSchema.safeParse({ email: 123 });
if (!r.success) {
  // Show a friendly validation message
}

قراءة مشكلات ZodError

يحتوي ZodError على مصفوفة issues تصف كل مشكلة: المسار، ورسالة، ورمز الخطأ.

import { z } from "zod";
const schema = z.object({ age: z.number() });
const r = schema.safeParse({ age: "x" });
if (!r.success) {
  for (const issue of r.error.issues) {
    console.log(issue.path, issue.message);
  }
}

كلاهما يُرجع النوع المستنتَج

عند النجاح، تمنحكم كلتا الطريقتين القيمة التي جرى التحقق منها، والمحددة النوع على أنها z.infer<typeof schema>، ولذلك تكون الشفرة اللاحقة محددة النوع بالكامل.

import { z } from "zod";
const userSchema = z.object({ name: z.string() });
type User = z.infer<typeof userSchema>;
const u: User = userSchema.parse({ name: "Ada" });
console.log(u.name);

اختيار الطريقة المناسبة

قاعدة عامة: استخدموا parse للمسارات الموثوقة أو الحرجة التي ينبغي أن يوقف الفشل تنفيذها، وsafeParse للمدخلات غير الموثوقة التي يجب التعامل معها دون حدوث انهيار.

import { z } from "zod";
const schema = z.string();
// Critical: schema.parse(value)
// User-facing: schema.safeParse(value)

الجمع بين الأسلوبين

من الأنماط الشائعة تغليف safeParse داخل دالة مساعدة تُرجع بيانات محددة النوع أو خطأً منسقًا، مما يوفر سهولة استخدام الطريقتين معًا.

import { z } from "zod";
function validate<T extends z.ZodType>(schema: T, value: unknown) {
  const r = schema.safeParse(value);
  return r.success ? { ok: true, data: r.data } : { ok: false, error: r.error };
}
// Reusable, no throwing.

اختبار سريع: parse في مقابل safeParse

اختبروا مدى فهمكم للفروق بين parse وsafeParse.

مراجعة: parse في مقابل safeParse

تعلّمتم أن parse تطلق استثناءً عند البيانات غير الصالحة، بينما تُرجع safeParse نتيجة من نوع success/error، كما تعلّمتم متى تستخدمون كل منهما وكيفية قراءة مشكلات ZodError.

import { z } from "zod";
const schema = z.object({ id: z.number() });
const r = schema.safeParse({ id: 1 });
if (r.success) console.log(r.data.id);

الأسئلة الشائعة

هل درس «parse مقابل safeParse» مجاني؟

نعم — نص درس «parse مقابل safeParse» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «parse مقابل safeParse»؟

تعاملوا مع نجاح التحقق وفشله بسلاسة تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «parse مقابل safeParse»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات مخططات Zod
  2. استنتاج الأنواع من المخططات
  3. parse مقابل safeParse
  4. تركيب المخططات وتنقيحها
← العودة إلى TypeScript Academy