टाइपस्क्रिप्ट: किसी मॉड्यूल के बाहर आयात विवरण का उपयोग नहीं किया जा सकता


19

मेरे पास नोड जेएस (नोड के नवीनतम संस्करण। 07.10.19 के लिए नोड) ऐप है, जो डिफ़ॉल्ट निर्यात के साथ नोड-मॉड्यूल आयात करने के साथ है। मैं इस निर्माण का उपयोग करता हूं: import { Class } from 'abc';जब मैं कोड चलाता हूं, तो मेरे पास यह त्रुटि है Cannot use import statement outside a module:।

नेटवर्क में मैं इस समस्या (.js) के लिए कई समाधान देखता हूं, लेकिन यह मेरे लिए मदद नहीं करता है, हो सकता है क्योंकि मेरे पास टाइपस्क्रिप्ट फ़ाइल हो। यहाँ मेरा कोड है:

import { Class } from 'abc';
module.exports = { ...
    execute(a : Class ,args : Array<string>){ ...

यहाँ मेरा tsconfig.json है:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",

    "strict": true
  }
}

क्या आप इसे किसी ब्राउज़र में चला रहे हैं? क्या importकथन आपकी फ़ाइल में पहली पंक्ति है?
एवर्ट

1
क्या आप अपनी tsconfig.json फ़ाइल पोस्ट कर सकते हैं? जब आप टाइपस्क्रिप्ट में संकलित करते हैं, तो आप यह निर्धारित कर सकते हैं कि यह किस प्रकार के मॉड्यूल का उत्पादन करता है, और मान्य प्रकार भिन्न हो सकते हैं कि कौन सा वातावरण (ब्राउज़र / नोडज) और कौन से अन्य मॉड्यूल ( requireबनाम import) आप उपयोग करते हैं। बस आपको यह समझने के लिए कि यह कितना जटिल है, नोड के पास बनाम के बारे में कुछ दस्तावेज हैं और उन्हें एक साथ कैसे काम करना है। importrequire
जेफ बोमन

1
यदि आप module.exportsसिंटैक्स का उपयोग कर रहे हैं , तो आप संभवतः ES6 मॉड्यूल में नहीं हैं।
बर्गी

Evert, यह नोड js app है, tsconfig जल्द ही जोड़ दिया जाएगा
Zerumi

ठीक है, मैं आवश्यकता का उपयोग नहीं कर सकता क्योंकि निर्माण का उपयोग करते समय नामस्थान 'एबीसी' नहीं ढूँढ सकताexecute(a : abc.Class...
ज़ीरुमी

जवाबों:


5

जोड़ना “type”: “module”package.json को नोड बता देंगे आप ES2015 मॉड्यूल है, जो त्रुटि से छुटकारा पाने चाहिए प्रयोग कर रहे हैं, लेकिन फिर आप टाइपप्रति बताने के लिए की स्थापना करके मॉड्यूल के इस प्रकार उत्पन्न करने के लिए की आवश्यकता होगी “module”: “es2015”बजाय “commonjs”tsconfig.json में।

हालाँकि यह वर्तमान कोड के साथ एक समस्या का कारण बनता है क्योंकि यद्यपि आप एक ES6 import {}कथन का उपयोग कर रहे हैं जिसे आप सामान्यJS module.exports = {}वाक्यविन्यास का उपयोग कर निर्यात कर रहे हैं , और नोड के ES मॉड्यूल लोडर के साथ एक समस्या होगी। इससे निपटने के दो तरीके हैं:

  1. module.exportsलेकिन इस फ़ाइल को एक .cjs एक्सटेंशन देकर सामान्य फ़ाइल के रूप में व्याख्या करने के लिए नोड को रखें ।
  2. निर्यात कथन को ES2015 सिंटैक्स में बदलें: export function execute(…)..

पहला विकल्प थोड़ा मुश्किल हो सकता है क्योंकि कंपाइलर .js फ़ाइलों को आउटपुट करेगा और आपको इसे .cjs में हर समय (जहाँ तक मुझे पता है) बदलना होगा। दूसरे विकल्प के साथ आप फ़ाइल को नोड के साथ चलाने में सक्षम होना चाहिए (संस्करणों के लिए --experimental-मॉड्यूल ध्वज <13.8 सहित)।

यदि आपको पूरी तरह से सामान्य जेएसएस का उपयोग करने की आवश्यकता है, तो शायद नोड के लिए टाइप परिभाषाओं को स्थापित करना बेहतर है: @ प्रकार / नोड और आयात को सामान्य जेएसएस प्रारूप में बदल दें: require('abc')और बाकी सेटिंग्स को वैसे ही रखें जैसे वे हैं (हालांकि आप "प्रकार" जोड़ सकते हैं) : "Commonjs" को package.json को स्पष्ट किया जाए)।


1
आवश्यकता ('एबीसी')। क्लास का उपयोग .ts परिभाषाओं में नहीं किया जा सकता है (जैसे: क्लास) ... के बारे में .cjs एक्सटेंशन ... प्रकार केवल .ts फाइलों में हो सकते हैं ... ES2015 भी मेरी पसंद नहीं है क्योंकि मैं उपयोग करता हूं हर जगह पुराने आयात (आवश्यकता) के साथ इस मॉड्यूल ... मैंने JSDoc का उपयोग करके इस समस्या को हल किया। लेकिन उत्तर के लिए धन्यवाद
Zerumi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.