it-swarm.dev

وجود خطأ "اسم الوحدة النمطية" يحل إلى وحدة نمطية غير نمطية في ... "عند كتابة ملف تعريف TypeScript مخصص

لا يمكنني العثور على تعريف TypeScript @type/{name} لأحد حزم NodeJS المثبتة ، لذا أحاول كتابة d.ts الملف الخاص به ، ووضع الملف في {project root}\typings مجلد. هذه هي الطريقة التي أقوم بها:

// My source code: index.ts
import Helper from 'node-helper-lib';


// My definition: \typings\node-helper-lib.d.ts
declare....(something else)

declare module 'node-helper-lib' {
   class Helper { ... }
   export = Helper;
}

ومع ذلك ، يحتفظ Visual Studio Code بإعطاء هذا الخطأ ويضع الخط الأحمر تحت declare module 'node-helper-lib':

[ts] اسم وحدة غير صالح في زيادة. الوحدة النمطية 'node-helper-lib' يتم حلها في وحدة نمطية غير نمطية في '{مسار المشروع}\node_modules\node-helper-lib\index.js' ، والتي لا يمكن زيادتها.

أليس صحيحًا لأن المكتبة غير مطبَّقة ، لذلك ينبغي أن يُسمح لي بإضافة الكتابة إليها؟

PDATE:

انا استخدم:

  • TypeScript: 2.1.4
  • رمز الاستوديو المرئي: 1.9.1
  • العقدة JS: 6.9.4
  • ويندوز 10 إلى x64
51
hirikarate

بعد بعض المحاولات والأخطاء ، وجدت أن augmentation تعني "إعلان وحدة نمطية في نفس الملف مع إعلان (إعلانات) وحدة أخرى".

لذلك إذا أردنا أن نكتب ملف تعريف لـ غير مطبوع مكتبة JavaScript لجهة خارجية ، يجب أن يكون لدينا واحد فقط declare module 'lib-name' في هذا الملف ، ويجب أن يتطابق اسم lib-name تمامًا مع اسم المكتبة (يمكن العثور عليه في package.json ، خاصية "name").

من ناحية أخرى ، إذا كانت مكتبة الطرف الثالث لديها بالفعل ملف تعريف.d.ts مضمنة ، ونريد تمديد وظائفها ، ثم يمكننا وضع التعريف الإضافي في ملف آخر نقوم بإنشائه. وهذا ما يسمى augmenting.

فمثلا:

// These module declarations are in same file, given that each of them already has their own definition file.
declare module 'events' {
   // Extended functionality
}

declare module 'querystring' {
   // Extended functionality        
}

declare module '...' { ... }

أترك اكتشافي هنا فقط في حال كان لدى شخص ما نفس السؤال. والرجاء تصحيح لي إذا فاتني شيء.

33
hirikarate

يتم إعطاء الحل الفعلي في تعليق بواسطةPaleo في إجابة hirikarate @:

يجب الإعلان عن الواردات داخل إعلان الوحدة النمطية.

مثال:

declare module 'node-helper-lib' {
   import * as SomeThirdParty from 'node-helper-lib';
   interface Helper {
       new(opt: SomeThirdParty.Options): SomeThirdParty.Type
   }
   export = Helper;
}
73
Lee Benson

كنت أتلقى رسالة الخطأ هذه أيضًا. كانت المشكلة بالنسبة لي هي أنني أحاول إعلان وحدة نمطية أخرى في ملف تعريف نوع موجود يحتوي على إعلان وحدة نمطية فيه. بعد أن قمت بنقل إعلان الوحدة الجديدة إلى ملف جديد ، انتهى الخطأ.

0
G-Wiz

في حالتي ، كنت قد استخدمت الإعلان التالي في أحد أنواع الملفات الخاصة بي ، لذا تمكنت من استخدام جميع الحزم غير التابعة لـ TypeScript:

declare module '*'
0
Alexey