declare في TypeScript: لماذا هو ضروري وكيفية استخدامه

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا تحتاج TypeScript إلى الكلمة المفتاحية declare؟

\n

تخيل أنك تبني منزلاً، لكن بعض الغرف موجودة بالفعل - بناها شخص آخر (مثل مكتبة JavaScript). لا يمكنك الدخول إليها وإعادة بناء الجدران، لكنك تحتاج إلى معرفة تخطيطها لوضع الأثاث بشكل صحيح. هذا هو بالضبط الدور الذي تؤديه الكلمة المفتاحية declare في TypeScript.

\n\n

إذا كنت قد عملت مع مكتبات شائعة (jQuery, Lodash, D3.js)، فمن المحتمل أنك صادفت ملفات .d.ts - هذه هي "التخطيطات" التي تم إنشاؤها باستخدام declare. في هذه المقالة، سنشرح ما هو declare، ولماذا هو ضروري، وكيفية استخدامه عمليًا. استعد - سيكون هناك الكثير من الكود وقليل من الحشو.

\n\n

ما هو declare في TypeScript؟

\n

declare هي كلمة مفتاحية تخبر مترجم TypeScript: "مرحبًا، هذا الشيء (متغير، دالة، كلاس أو وحدة) موجود، لكنه مُعرّف في مكان آخر. فقط صدقني واسمح لي باستخدامه في الكود."

\n\n

من المهم أن تفهم: declare لا يُنشئ أي كود JavaScript. إنها بنية معلوماتية بحتة للمترجم. إذا كتبت declare const x: number = 5، فبعد التجميع سيختفي x - لن يكون موجودًا في الملف النهائي.

\n\n

متى نحتاج إلى ذلك؟

\n
    \n
  • العمل مع المتغيرات العامة - مثل window، document أو المتغيرات المضافة عبر CDN.
  • \n
  • كتابة الأنواع لمكتبات JavaScript - عندما تكون المكتبة مكتوبة بلغة JS خالصة، لكنك تريد استخدامها مع TypeScript.
  • \n
  • إنشاء أنواع لملفات التكوين - وحدات CSS، الصور، ملفات JSON.
  • \n
\n\n

صياغة declare: أمثلة أساسية

\n\n

1. إعلان المتغيرات

\n

لنفترض أن لديك متغيرًا عامًا VERSION، مُعرّف في ملف HTML عبر <script>. TypeScript لا يعرف عنه شيئًا، لذا تكتب:

\n
declare const VERSION: string;\n\nconsole.log(VERSION); // حسنًا، TypeScript يعرف أنه نص\n
\n

بعد التجميع، سيختفي declare const VERSION: string، وسيبقى console.log(VERSION).

\n\n

2. إعلان الدوال

\n

تخيل أن لديك دالة عامة trackEvent من نظام التحليلات:

\n
declare function trackEvent(eventName: string, properties?: Record<string, any>): void;\n\n// الاستخدام\ntrackEvent("button_click", { buttonId: "submit" });\n
\n

لن يتحقق المترجم من التنفيذ - إنه يعرف التوقيع فقط.

\n\n

3. إعلان الكلاسات

\n

توفر المكتبة كلاس Moment من مساحة الأسماء العامة:

\n
declare class Moment {\n    constructor(date: string);\n    format(pattern: string): string;\n}\n\n// الاستخدام\nconst now = new Moment("2024-01-01");\nconsole.log(now.format("YYYY-MM-DD"));\n
\n\n

4. إعلان الوحدات

\n

هذا هو السيناريو الأكثر شيوعًا. على سبيل المثال، لديك وحدات CSS أو ملفات JSON:

\n
// styles.d.ts\ndeclare module "*.css" {\n    const styles: Record<string, string>;\n    export default styles;\n}\n\n// images.d.ts\ndeclare module "*.png" {\n    const src: string;\n    export default src;\n}\n
\n

الآن يمكنك استيراد CSS والصور دون أخطاء من TypeScript.

\n\n

declare وملفات .d.ts

\n

الملفات ذات الامتداد .d.ts (إعلانات الأنواع) هي "موطن" الكلمة المفتاحية declare. تحتوي فقط على إعلانات ولا يتم تجميعها إلى JavaScript. عادةً ما تكون موجودة في مجلد types/ أو تأتي مع المكتبة (مثل @types/lodash).

\n\n

مثال: إنشاء أنواع لـ jQuery

\n

المدونات

توصيات الكتب