ما هو ملف التصريح؟
ملف بامتداد .d.ts يحتوي أنواعًا فقط، بلا أي تنفيذ. لا يُترجَم أبدًا
إلى JavaScript — وظيفته الوحيدة أن يخبر TypeScript بشكل شيء موجود أصلًا
(مكتبة، دالة عامّة، وحدة) حتى يفحص استخدامك له.
// math-helpers.d.ts
export function double(n: number): number;
هذا الملف لا ينتج أي .js عند البناء — فقط يجعل TypeScript يعرف أن دالة
double موجودة وتوقيعها.
من أين تأتي أنواع المكتبات؟
عند تثبيت مكتبة JavaScript، أنواعها تأتي من إحدى ثلاث طرق:
-
مرفقة بالمكتبة نفسها — حزم كثيرة حديثة (مثل zod وdate-fns) تكتب بـ TypeScript أصلًا أو تشحن ملفات
.d.tsمعها مباشرة، فلا تحتاج شيئًا إضافيًّا. -
حزمة
@typesمنفصلة من DefinitelyTyped — مستودع مجتمعي ضخم يجمع أنواعًا لآلاف مكتبات JavaScript التي لا تكتب أنواعها بنفسها:npm install lodash npm install -D @types/lodashTypeScript يكتشف هذه الحزم تلقائيًّا من
node_modules/@typesدون أي إعداد إضافي. -
أنواع مدمجة في TypeScript نفسه — ملفات
lib.*.d.tsالتي تصف واجهات JavaScript القياسية (Array،Promise،Math...)، وتتحدّد حسب إعدادtargetوlibفيtsconfig.json.
عندما لا توجد أنواع جاهزة
بعض مكتبات JavaScript القديمة أو الداخلية لا تملك أنواعًا في أي مكان. هنا تكتب تصريحك الخاص:
// types/legacy-lib.d.ts
declare module "legacy-lib" {
export function init(config: { debug: boolean }): void;
export const version: string;
}
بعد هذا، أي استيراد لـ "legacy-lib" في مشروعك يصبح منمَّطًا بالكامل.
تصريح سريع بلا تفاصيل
إذا أردت فقط إسكات خطأ "لا يوجد تعريف نوع لهذه الوحدة" دون كتابة الأنواع الحقيقية بعد (حل مؤقّت):
declare module "legacy-lib";
هذا يجعل كل شيء مستورَد من "legacy-lib" بنوع any ضمنيًّا — يوقف الخطأ
لكنه يفقدك أمان النوع بالكامل لتلك المكتبة، فاستخدمه مؤقّتًا فقط.
جدول: مصادر أنواع المكتبات
| المصدر | مثال | تحتاج تثبيت شيء؟ |
|---|---|---|
| مرفقة بالمكتبة | zod، date-fns | لا |
| DefinitelyTyped | @types/lodash | نعم، حزمة منفصلة |
تصريح يدوي (declare module) | مكتبة داخلية بلا أنواع | لا، تكتبه أنت |
💡 قبل كتابة تصريح يدوي طويل، ابحث دائمًا عن اسم المكتبة على DefinitelyTyped — غالبًا أحد سبقك وكتب الأنواع فعلًا.
أخطاء شائعة
- نسيان تثبيت
@types/xxxلمكتبة تحتاجها، فيظهر خطأ "Could not find a declaration file for module". - الاكتفاء بـ
declare module "x";الفارغة إلى الأبد بدل توثيق الأنواع الحقيقية لاحقًا — يفقدك فحص TypeScript كليًّا لتلك المكتبة. - الظن أن ملفات
.d.tsتحتاج بناءً أو تُرجَم — هي للفحص فقط، لا يخرج منها أي JavaScript.
🎯 التالي: الخلاصة وخطواتك بعد TypeScript.