कस्टम टाइपस्क्रिप्ट डेफिनिशन फ़ाइल लिखते समय त्रुटि "मॉड्यूल का नाम 'एक अप्रतिबंधित मॉड्यूल पर हल होता है"


90

मुझे @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 कोड इस त्रुटि को बनाए रखता है और इसके अंतर्गत लाल रेखा डालता है declare module 'node-helper-lib':

[ts] वृद्धि में अमान्य मॉड्यूल नाम। मॉड्यूल 'नोड-हेल्पर-लीबी' '{प्रोजेक्ट पथ} \ नोड_मॉड्यूल्स \ नोड-हेल्पर-लिबास \ इंड्स.जेएस' पर एक अप्रतिबंधित मॉड्यूल का समाधान करता है, जिसे संवर्धित नहीं किया जा सकता है।

क्या यह वैध नहीं है क्योंकि पुस्तकालय अप्रकाशित है, इसलिए मुझे इसमें टाइपिंग जोड़ने की अनुमति दी जानी चाहिए?

अपडेट करें:

मै इस्तेमाल कर रहा हूँ:

  • टाइपस्क्रिप्ट: 2.1.4
  • विजुअल स्टूडियो कोड: 1.9.1
  • नोड जेएस: 6.9.4
  • विंडोज 10 x64

जवाबों:


153

वास्तविक समाधान @Paleo द्वारा @ hirikarate के उत्तर में एक टिप्पणी में दिया गया है:

मॉड्यूल घोषणा के अंदर आयात घोषित किया जाना चाहिए ।

उदाहरण:

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

55

कुछ प्रयासों और त्रुटियों के बाद, मैंने पाया कि augmentation"उसी मॉड्यूल में एक मॉड्यूल को अन्य मॉड्यूल घोषणा (एस) के साथ घोषित करने का मतलब है"।

इसलिए अगर हम किसी अनकैप्ड 3-पार्टी जावास्क्रिप्ट लाइब्रेरी के लिए डेफिनिशन फाइल लिखना चाहते हैं , तो हमारे पास declare module 'lib-name'उस फाइल में केवल एक ही होना चाहिए , और 'lib-name' को लाइब्रेरी के नाम से बिल्कुल मेल खाना चाहिए (इसके पैकेज में पाया जा सकता है। Json, " नाम "संपत्ति)।

दूसरी ओर, यदि एक 3-पार्टी लाइब्रेरी में पहले से ही परिभाषा फ़ाइल .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 '...' { ... }

मैं अपनी खोज को यहीं छोड़ देता हूं जब किसी के पास एक ही प्रश्न होता है। और अगर मुझे कुछ याद आया तो कृपया मुझे सुधारें।


1
अगर 3-पार्टी लाइब्रेरी में पहले से ही परिभाषा फ़ाइल .d.ts शामिल है, तो मुझे क्या करना चाहिए, लेकिन मैं इसे अनदेखा करना चाहूंगा और एक कस्टम का उपयोग करूंगा?
एलेन लियांग

24
मैं एक पूरी तरह से supertestअप्रभावित npm मॉड्यूल के लिए एक परिभाषा फ़ाइल लिखने की कोशिश कर रहा हूं, - टाइपस्क्रिप्ट की शिकायत भी समझ में नहीं आती है, मैं कुछ कैसे बढ़ा सकता हूं जिसमें घोषणा भी नहीं है? मैंने सोचा है कि मैंने कई बार इस तरह की कस्टम परिभाषा फाइलें लिखी हैं ... [ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', which cannot be augmented.- दुर्भाग्य @types/supertestसे डीओएम लाइब्रेरी को शामिल करके इसे तोड़ दिया गया है .. ऐसा लग रहा है कि मैं भाग्य से बाहर हूं
चेसमोस्कल

35
@ChaseMoskal: आपकी फ़ाइल में .d.ts, शायद आपको सभी आयातों को घोषित मॉड्यूल "मॉड्यूलनाम" {} में ले जाना चाहिए।
पालेओ

17
@ पैलियो जो बिल्कुल यही था, सभी importकॉल को declare module 'module' {}दायरे में जाना चाहिए । त्रुटि सबसे अच्छा है
pocesar

2
टाइपस्क्रिप्ट एक ही काम करता है यदि आप importअपने मॉड्यूल द्वारा आवश्यक बयानों को declare moduleइसके अंदर के बजाय बाहर रखते हैं । इस तरह के अनजाने में अजीब व्यवहार (यहाँ ranting के लिए खेद है)।
binki

0

मुझे वह त्रुटि संदेश भी मिल रहा था। मेरे लिए मुद्दा यह था कि मैं एक मौजूदा प्रकार की परिभाषा फ़ाइल में एक और मॉड्यूल घोषित करने की कोशिश कर रहा था जिसमें एक मॉड्यूल घोषणा थी। जब मैंने नए मॉड्यूल की घोषणा को एक नई फ़ाइल में स्थानांतरित किया, तो त्रुटि दूर हो गई।


-4

मेरे मामले में मैंने सिर्फ अपनी एक प्रकार की फाइल में घोषणा के बाद उपयोग किया था इसलिए मैं सभी गैर-टाइपस्क्रिप्ट पैकेजों का उपयोग करने में सक्षम था:

declare module '*'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.