TypeScript - استبعاد/كتابة أنواع مبرمجة مقدمة من npm


لدي حزمة npm بها تعريفات مكتوبة بشكل سيء وقديمة. لقد كتبت تعريفاتي الخاصة والآن أتساءل عما إذا كان بإمكاني بطريقة ما استبعاد التعريفات الأصلية من حزمة npm. الأمر ليس مجرد توسيع للواجهات، فالأصلية أصبحت في الأساس قُمامة في الوقت الحالي.

استخدام قائمة الاستبعاد في tsconfig.json لا يعمل لهذا الغرض بالطبع، لأنه لا يزال يقوم بتحميل الملفات من node_modules حتى لو استبعدت هذا المجلد.

الإجابة رقم 1

قم بإنشاء مجلد node_modules داخل src الخاص بك، ثم ضع تعريفات النوع (typings) للوحدة أو الوحدات التي تريد الكتابة فوقها بداخله:

├── node_modules
│   └── ...
│
└── src
    ├── index.ts
    ├── ... your codes ...
    │
    └── node_modules
        └── <module-to-be-overwritten>
            └── index.d.ts

لا داعي لتعديل compilerOptions في tsconfig.json.

اقرأ قسم كيف يحل TypeScript الوحدات في https://www.typescriptlang.org/docs/handbook/module-resolution.html.

الإجابة رقم 2

يمكنك الحصول على السلوك المطلوب باستخدام خيار المسارات في tsConfig قد يبدو شيئًا مثل هذا:

{
    "compilerOptions": {
       ...
        "paths": {
            "*": [
                "src/*",
                "declarations/*"
            ]
        }
    },
    ...
}

مع هذا الإعداد، يبحث TypeScript عن الوحدات في مجلد src (يجب أن يحتوي على كل مصادر التطبيق) وأيضًا في مجلد declarations، في مجلد declarations عادةً أضع الإعلانات الإضافية التي أحتاجها.

لتجاوز تعريفات نوعية وحدة Node، هناك خياران:

  1. ضع مجلدًا باسم الوحدة داخل مجلد التصريحات، يحتوي على ملف يسمى index.d.ts للأنواع

  2. ضع ملف إعلان، مسمى مثل الوحدة، داخل مجلد الإعلانات

كمثال عملي يمكنك إلقاء نظرة على هذا المستودع https://github.com/kaoDev/react-ts-sample

تلميح مهم من بيرنهارد كوينغ:

ترتيب المسارات مهم. كان علي وضع المسار الذي يحتوي على التعديلات الخاصة بي قبل المسار الذي يحتوي على تعريفات النوع الأصلية حتى يتم التقاط التعديلات الخاصة بي أولاً. - برنارد كونيغ