لماذا يصرخ TypeScript الخاص بك بشأن "المُزينات التجريبية"؟
\n\nهل سبق لك أن قمت بتشغيل ترجمة مشروع TypeScript ورأيت في وحدة التحكم شيئًا مثل:
\n\nالدعم التجريبي للمُزينات هو ميزة قابلة للتغيير في إصدار مستقبلي. قم بتعيين خيار 'experimentalDecorators' في ملف 'tsconfig.json' الخاص بك أو '--experimentalDecorators' لإزالة هذا التحذير.\n\nإذا كان الأمر كذلك - فأنت لست وحدك. هذا السؤال على Stack Overflow جمع آلاف المشاهدات وعشرات الإجابات. لكن معظمها يقترح ببساطة "تشغيل العلامة ونسيان الأمر". ونحن اليوم سنذهب أبعد من ذلك: سنفهم ما هو تحذير experimental decorators في TypeScript، ومن أين يأتي، وكيف يعمل تحت الغطاء، ولماذا يعتبر TypeScript المُزينات "تجريبية" أساسًا.
\n\nما هي المُزينات في TypeScript (ولماذا هي تجريبية)؟
\n\nالمُزينات هي أداة قوية للبرمجة الوصفية. فهي تسمح بتعليق وتعديل الفئات والطرق والخصائص والمعاملات أثناء وقت التنفيذ. إذا كنت قد عملت مع Angular أو NestJS أو TypeORM، فمن المحتمل أنك صادفتها:
\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html'\n})\nclass AppComponent {}\n\nولكن المشكلة تكمن في أن معيار JavaScript للمُزينات (اقتراح TC39) لا يزال في المرحلة الثالثة (Stage 3). هذا يعني أن بناء الجملة والدلالات قد تتغير. TypeScript، كونه مجموعة شاملة من JavaScript، لا يمكنه ببساطة "تجميد" التنفيذ - فهو يقدم دعمًا تجريبيًا للمُزينات من خلال العلامة experimentalDecorators.
عند تشغيل هذا الخيار، يقوم مترجم TypeScript بإنشاء كود قد يصبح قديمًا أو يتعطل عند تحديث المعيار. ولهذا السبب يحذرك بصدق: "تستخدمها على مسؤوليتك الخاصة".
\n\nكيف يعمل تحذير experimental decorators تحت غطاء المترجم؟
\n\nلفهم التحذير، دعنا نلقي نظرة على المصادر الداخلية لـ TypeScript. في ملف checker.ts (نعم، هذا ملف حقيقي داخل المترجم) توجد دالة checkGrammarForDecorator. عندما يواجه المحلل اللغوي مُزينًا، يتحقق المترجم مما إذا كانت العلامة experimentalDecorators مضبوطة في ملف tsconfig.json.
إذا لم تكن العلامة مضبوطة، فإنه يُنشئ رسالة تشخيصية - نفس التحذير. إنه ليس خطأ (سيظل الكود يُترجم)، لكن المترجم يذكرك بإصرار: "مرحبًا، أنت تستخدم ميزة قد تتغير!".
\n\nإليك كيف يبدو المنطق المبسط:
\n\n// كود زائف للمنطق الحقيقي لـ TypeScript\nfunction checkDecoratorUsage(decorator: Decorator, options: CompilerOptions) {\n if (!options.experimentalDecorators) {\n reportDiagnostic({\n code: 1219,\n message: "الدعم التجريبي للمُزينات هو ميزة قابلة للتغيير في إصدار مستقبلي..."\n });\n }\n}\n\nرمز الخطأ 1219 هو بالضبط التحذير الذي تراه. ورمز 1220 هو تحذير مماثل لـ emitDecoratorMetadata (علامة تجريبية أخرى سنتحدث عنها أدناه).
كيفية إيقاف تحذير experimental decorators: 3 طرق
\n\nأسهل طريقة هي إضافة العلامة إلى ملف tsconfig.json:
{\n "compilerOptions": {\n "experimentalDecorators": true\n }\n}\n\nإذا كنت تستخدم سطر الأوامر:
\n\ntsc --experimentalDecorators\n\nأو إذا لم يكن لديك ملف tsconfig.json، يمكنك تمرير العلامة مباشرة:
npx tsc --experimentalDecorators src/index.ts\n\nبعد ذلك سيختفي التحذير. لكن هذا مجرد غيض من فيض. دعنا نفهم ما يحدث حقًا عند تشغيل experimentalDecorators.
ماذا يُنشئ المترجم تحت الغطاء؟
\n\nعند كتابة مُزين للفئة