0Pricing
TypeScript Academy · درس

التحقق من المدخلات وقت التجميع

ارفضوا تعبيرات DSL المشوهة قبل التشغيل

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

التحقق من المدخلات وقت الترجمة

يمكن لـ DSLs على مستوى النوع رفض التعبيرات المشوهة قبل وقت التشغيل. وباستخدام أنواع القوالب النصية والأنواع الشرطية، نتحقق من بنية السلسلة على مستوى النوع ونرفض المدخلات غير الصحيحة.

مثال: لغة محددات مصغرة

تخيّلوا قبول سلاسل مثل "user.name" أو "order.items.length". نريد رفض "user." أو ".name" وقت الترجمة.

التحليل باستخدام القوالب النصية

تقسم أنواع القوالب النصية السلسلة إلى أجزاء باستخدام infer، وهو أساس التحليل وقت الترجمة. والنمط الحقيقي محدد بعلامتي backtick (Head dot Tail with infer)؛ ونشير إلى أداة المطابقة المقسِّمة هذه باسم DotSplit.

// Real TS: backtick pattern matching Head, ".", Tail.

type Split<S extends string> =
  S extends DotSplit<infer Head, infer Tail>
    ? [Head, ...Split<Tail>]
    : [S];

type P = Split<"a.b.c">; // ["a", "b", "c"]

التحقق من صحة كل مقطع

يتحقق نوع شرطي من عدم فراغ أي مقطع. ويجعل المقطع الفارغ المدخل غير صالح. ويقود نمط DotSplit نفسه (وهو قالب نصي محاط بعلامتي backtick في الكود الحقيقي) عملية الاستدعاء التكراري.

type NonEmpty<S extends string> = S extends "" ? false : true;

type Valid<S extends string> =
  S extends DotSplit<infer H, infer T>
    ? H extends "" ? false : Valid<T>
    : NonEmpty<S>;

type V1 = Valid<"a.b">;  // true
type V2 = Valid<"a.">;   // false

تقييد واجهة API بالصلاحية

استخدم نوع الصلاحية لتقييد معلمة الدالة: تحتفظ السلاسل النصية الصالحة بنوعها، بينما تتحول السلاسل غير الصالحة إلى never، ولذلك يفشل استدعاء الدالة في الترجمة.

declare function path<S extends string>(
  p: Valid<S> extends true ? S : never
): void;

path("user.name"); // ok
path("user.");     // Error: argument is never

رفض الرموز غير المعروفة

يمكنك تقييد الأحرف المسموح بها أيضًا. طابق أنماط المقاطع المعروفة فقط؛ فأي شيء آخر يتحول إلى نوع رافض.

type Allowed = "user" | "order" | "name" | "items";
type CheckSeg<S extends string> = S extends Allowed ? true : false;

التحقق من صحة المعاملات

في DSL للتعابير مثل "age > 18"، طابق المعامل باستخدام قالب حرفي وتأكد من أنه ضمن مجموعة مسموح بها. المطابق (مسافة يسار O مسافة يمين) هو قالب حرفي باستخدام backtick في الشيفرة الحقيقية؛ ونستخدم CondMatch للدلالة عليه.

type Op = ">" | "<" | "=" | ">=" | "<=";

// Real TS: backtick pattern -> left, " ", infer O, " ", right.
type IsCond<S extends string> =
  S extends CondMatch<infer O>
    ? O extends Op ? true : false
    : false;

type C1 = IsCond<"age > 18">; // true
type C2 = IsCond<"age ! 18">; // false

دمج عمليات التحقق

تجمع أدوات التحقق الحقيقية عدة شروط: المقاطع غير الفارغة، والرموز المسموح بها، والبنية المتوازنة. كل شرط منها نوع شرطي؛ ويمكن دمجها باستخدام أنواع مساعدة ذات منطق مشابه للمنطق البولياني.

type And<A, B> = A extends true ? (B extends true ? true : false) : false;

حدود الاستدعاء التكراري

للاستدعاء التكراري على مستوى الأنواع حدود تتعلق بالعمق. بالنسبة إلى السلاسل الطويلة جدًا، قد يعرض المترجم الخطأ "type instantiation is excessively deep". اجعل المدخلات التي يجري تحليلها محدودة الطول أو بسّط القواعد النحوية.

أفضل من التحليل وقت التشغيل

لا يعترض محلل وقت التشغيل إلا عند تقييم السلسلة النصية غير الصحيحة. أما التحقق وقت الترجمة فيرفض الحرفية بمجرد كتابتها، مع ملاحظات كاملة في المحرر وبدون أي تكلفة وقت التشغيل.

لماذا يهم هذا

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

اختبار سريع

تحقق من فهمك للتحقق من صحة المدخلات وقت الترجمة.

مراجعة

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

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

هل درس «التحقق من المدخلات وقت التجميع» مجاني؟

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

ماذا ستتعلم في «التحقق من المدخلات وقت التجميع»؟

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

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

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

كم من الوقت يستغرق درس «التحقق من المدخلات وقت التجميع»؟

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

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

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

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

  1. ما هي DSL على مستوى النوع
  2. تصميم DSL للاستعلامات السلسة
  3. التحقق من المدخلات وقت التجميع
  4. رسائل الأخطاء في DSL على مستوى النوع
← العودة إلى TypeScript Academy