فرض الخطوات المطلوبة
امنعوا build() حتى تعيين جميع الحقول المطلوبة
فرض الخطوات المطلوبة درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
منع استدعاء build() مبكرًا
نستخدم الآن الحالة المتراكمة لمنع استدعاء build() قبل تعيين الحقول المطلوبة. إذ يمنع نظام الأنواع عملية البناء غير المكتملة، لا فحص وقت التشغيل.
تحديد الشكل النهائي
ابدأ بالإعلان عن الكائن الكامل وتحديد المفاتيح الإلزامية. ولن يسمح المنشئ باستدعاء build() إلا عندما تتضمن الحالة جميع هذه المفاتيح.
interface Config {
url: string; // required
method: string; // required
timeout?: number; // optional
}
type Required = { url: string; method: string };توقيع build الشرطي
نجعل build متاحًا فقط عندما تمتد الحالة المتراكمة S لتشمل المفاتيح المطلوبة. ويعيد النوع الشرطي الدالة الحقيقية أو دالة غير قابلة للاستخدام.
class Builder<S> {
build(this: Builder<Required>): Config {
return this.d as Config;
}
private d: Record<string, unknown> = {};
}استخدام معامل this
يقيّد معامل this: Builder<Required> أي مثيلات المنشئ يمكنها استدعاء build. وإذا لم تستوفِ S متطلبات Required، فسيكون الاستدعاء خطأً في النوع.
// Only a Builder whose S includes url and method
// can legally invoke build().ربط دوال التعيين بالحالة
توسّع كل دالة تعيين S كما سبق. وبعد تنفيذ دالتي التعيين المطلوبتين، تمتد S أخيرًا لتشمل Required، ويصبح build قابلًا للاستدعاء.
class Builder<S> {
private d: Record<string, unknown> = {};
url(u: string): Builder<S & { url: string }> { this.d.url = u; return this as any; }
method(m: string): Builder<S & { method: string }> { this.d.method = m; return this as any; }
build(this: Builder<{ url: string; method: string }>): Config { return this.d as Config; }
}يُترجم المسار الناجح
عند وجود الخطوتين المطلوبتين، يجتاز التسلسل فحص الأنواع ويعمل. ويكون المترجم متأكدًا من أن S تتضمن كل مفتاح مطلوب.
const cfg = new Builder<{}>().url("/x").method("GET").build();
console.log(cfg.url, cfg.method);يفشل المسار غير الناجح
احذف خطوة مطلوبة، وعندها لن يجتاز build() فحص الأنواع، لأن S الخاصة بالمنشئ لا تمتد لتشمل Required. ويُكتشف الخطأ وقت الترجمة.
// const bad = new Builder<{}>().url("/x").build();
// Error: 'build' can only be called when method is set too.لماذا يتفوق هذا على حواجز وقت التشغيل؟
لا يفشل شرط وقت التشغيل if (!this.url) throw إلا عند تشغيل التعليمات البرمجية. أما أسلوب معامل this فيفشل أثناء فحص الأنواع، ولذلك لا تصل عمليات البناء غير المكتملة إلى الإنتاج.
تبقى الحقول الاختيارية اختيارية
لا تُعدّ الخطوات الاختيارية مثل timeout جزءًا من Required، ولذلك لا تتحكم في إتاحة build(). ويمكنك تضمينها أو تخطيها بحرية.
const ok = new Builder<{}>().method("PUT").url("/y").build();
console.log("order of required steps does not matter");التوسع ليشمل متطلبات كثيرة
أضف مزيدًا من المفاتيح الإلزامية إلى شكل Required وإلى معامل this، وسيفرض المترجم وجودها جميعًا. ويتوسع هذا النمط ليشمل أي عدد من الخطوات المطلوبة.
القيود
يعتمد هذا الضمان على تمرير S بأمانة عبر كل دالة تعيين وعلى استخدام كتابة معامل this. ويجب حصر عمليات التحويل في دوال التعيين حتى يبقى المستدعون آمنين تمامًا من ناحية الأنواع.
فحص سريع
فحص سريع لهذا الدرس.
مراجعة
من أجل فرض الخطوات المطلوبة، اكتب نوع build باستخدام معامل this: Builder<Required>. ولا يجتاز الأسلوب فحص الأنواع إلا بعد أن تتضمن الحالة المتراكمة S كل مفتاح مطلوب، وبذلك يتحول الإنشاء غير المكتمل إلى خطأ في الترجمة.
الأسئلة الشائعة
هل درس «فرض الخطوات المطلوبة» مجاني؟
نعم — نص درس «فرض الخطوات المطلوبة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «فرض الخطوات المطلوبة»؟
امنعوا build() حتى تعيين جميع الحقول المطلوبة تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «فرض الخطوات المطلوبة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات نمط Builder
- الواجهات السلسة مع الأنواع
- فرض الخطوات المطلوبة
- Builders غير القابلة للتغيير