0Pricing
TypeScript Academy · درس

أمان أنواع الاستيفاء

استخرجوا متغيرات الاستيفاء من السلاسل وألزموا بها

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

الاستيفاء الآمن للأنواع

غالبًا ما تتضمن الرسائل عناصر نائبة مثل "Hello, {name}". وتستخرج i18n الآمنة للأنواع أسماء تلك العناصر النائبة من نوع سلسلة الرسالة، وتلزمكم بتمرير الوسائط المطابقة.

الهدف

بالاعتماد على النوع الحرفي لرسالة، نريد حساب كائن المتغيرات التي تحتاج إليها، بحيث يُفرض استخدام t("greet", { name: "Ada" }) ويصبح غياب name خطأً في الترجمة.

استخراج عنصر نائب واحد

يسحب نوع شرطي حرفي قالب اسم المتغير من سلسلة تحتوي على عنصر نائب واحد. وفي الشيفرة الفعلية يُكتب النمط باستخدام backticks على النحو التالي: string، ثم قوس معقوف مفتوح، ثم infer V، ثم قوس معقوف مغلق، ثم string. ونمثل هذا المطابق أدناه باسم BraceMatch.

// Real TS pattern (backtick template literal):
//   matches any text, then {V}, then any text; infers V.

type Var<S extends string> =
  S extends BraceMatch<infer V> ? V : never;

type A = Var<"Hello, {name}">; // "name"

استخراج عناصر نائبة متعددة

استخدموا التكرار لجمع كل عنصر نائب في اتحاد. يلتقط النمط متغيرًا واحدًا مع الجزء المتبقي، ثم يكرر العملية على الجزء المتبقي.

// Pattern: any text, {V}, then Rest tail -- infer V and Rest.

type Vars<S extends string> =
  S extends BraceMatchRest<infer V, infer Rest>
    ? V | Vars<Rest>
    : never;

type B = Vars<"Hi {first} {last}!">; // "first" | "last"

من الأسماء إلى كائن Args

حوّلوا اتحاد الأسماء إلى نوع كائن مطلوب باستخدام نوع مُحوّل.

type ArgsOf<S extends string> = {
  [K in Vars<S>]: string | number;
};

type G = ArgsOf<"Hello, {name}">;
// { name: string | number }

لا عناصر نائبة، ولا وسائط

عندما لا تحتوي الرسالة على عناصر نائبة، تكون Vars مساويةً لـ never، ولذلك يكون كائن الوسائط فارغًا. ويمكننا جعل معلمة الوسائط اختيارية في هذه الحالة.

type C = Vars<"Goodbye">;       // never
type D = ArgsOf<"Goodbye">;     // {} (empty)

دالة ترجمة منمّطة

اجعلوا معلمة الوسائط تعتمد على المفتاح المختار عبر البحث عن حرفية الرسالة وحساب وسائطها.

declare const messages: {
  greet: "Hello, {name}";
  invite: "Join {count} others";
};

declare function t<K extends keyof typeof messages>(
  key: K,
  args: ArgsOf<(typeof messages)[K]>
): string;

التنفيذ الإلزامي عمليًا

يصر المترجم الآن على استخدام المتغيرات المحددة بالضبط لكل رسالة.

t("greet", { name: "Ada" });   // ok
t("greet", {});                 // Error: name is missing
t("invite", { count: 3 });      // ok
t("invite", { name: "x" });     // Error: count missing, name unexpected

وسائط اختيارية للرسائل العادية

استخدموا حمولة زائدة شرطية حتى لا تتطلب الرسائل التي لا تحتوي على عناصر نائبة وسيطًا ثانيًا على الإطلاق.

type MaybeArgs<S extends string> =
  Vars<S> extends never ? [] : [args: ArgsOf<S>];

declare function t2<K extends keyof typeof messages>(
  key: K,
  ...rest: MaybeArgs<(typeof messages)[K]>
): string;

محددات مخصصة

إذا كان الفهرس لديكم يستخدم {{name}} أو %{name}، فعدّلوا النمط الحرفي القالب في Vars وفقًا لذلك. فالتقنية واحدة، ولا يتغير إلا الحرف المحيط.

لماذا يهم هذا

تُعد متغيرات الاستيفاء المفقودة أو المكتوبة بطريقة خاطئة مصدرًا شائعًا لتعطّل نصوص واجهة المستخدم ("Hello, undefined"). ويؤدي استخراجها على مستوى النوع إلى تحويل هذه المشكلات إلى أخطاء في وقت الترجمة، كما يوثّق عقد كل رسالة.

تحقّق سريع

اختبر مدى فهمك لأمان الأنواع في الاستيفاء.

مراجعة

من خلال مطابقة الأنواع الحرفية للرسائل باستخدام القوالب النصية وinfer، تستخرج أسماء العناصر النائبة في اتحاد، وتربطها بكائن وسائط مطلوب، وتجعل دالة الترجمة تطلب هذه المتغيرات تحديدًا، مع جعل الوسائط اختيارية عند عدم وجود متغيرات.

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

هل درس «أمان أنواع الاستيفاء» مجاني؟

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

ماذا ستتعلم في «أمان أنواع الاستيفاء»؟

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

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

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

كم من الوقت يستغرق درس «أمان أنواع الاستيفاء»؟

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

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

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

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

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