मॉड्यूल 'मॉड्यूल-नाम' के लिए एक घोषणा फ़ाइल नहीं मिल सकी। '/ path/to/module-name.js' का तात्पर्य 'कोई' प्रकार है


303

मैंने पढ़ा कि टाइपस्क्रिप्ट मॉड्यूल रिज़ॉल्यूशन कैसे काम करता है।

मेरे पास निम्नलिखित भंडार हैं: @ ts-stack / di । निर्देशिका संरचना संकलित करने के बाद इस प्रकार है:

├── dist
   ├── annotations.d.ts
   ├── annotations.js
   ├── index.d.ts
   ├── index.js
   ├── injector.d.ts
   ├── injector.js
   ├── profiler.d.ts
   ├── profiler.js
   ├── providers.d.ts
   ├── providers.js
   ├── util.d.ts
   └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
   ├── annotations.ts
   ├── index.ts
   ├── injector.ts
   ├── profiler.ts
   ├── providers.ts
   └── util.ts
└── tsconfig.json

मेरे पैकेज में। मैंने लिखा "main": "dist/index.js"

Node.js में सब कुछ ठीक काम करता है, लेकिन टाइपस्क्रिप्ट:

import {Injector} from '@ts-stack/di';

मॉड्यूल '@ ts-stack / di' के लिए एक घोषणा फ़ाइल नहीं मिल सकी। '/ path/to/node_modules/@ts-stack/di/dist/index.js' का अर्थ 'कोई' प्रकार है।

और फिर भी, यदि मैं निम्नानुसार आयात करता हूं, तो सब कुछ काम करता है:

import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';

मैं क्या गलत कर रहा हूं?

जवाबों:


295

यहाँ दो अन्य समाधान हैं

जब एक मॉड्यूल आपका नहीं है - इससे प्रकार स्थापित करने का प्रयास करें @types:

npm install -D @types/module-name

यदि उपरोक्त त्रुटियां हैं - importबयान बदलने का प्रयास करें require:

// import * as yourModuleName from 'module-name';
const yourModuleName = require('module-name');

13
यदि आपको नाम नहीं मिल रहा है तो टाइपस्क्रिप्ट 2.0 के लिए इसे चलाने की आवश्यकता है:npm install @types/node --save-dev
ओग्लास

120
यदि मॉड्यूल में @types पैकेज नहीं है तो क्या होगा?
डैनियल Kmak

37
मुझे लगता है कि requireइसके बजाय का उपयोग करना importथोड़ा-सा प्रतिमान है: किसी .d.tsफ़ाइल में मॉड्यूल की घोषणा करना बेहतर है ; नीचे मेरा जवाब देखें।
रतसम

2
उदाहरण उपयोग: const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
स्वेडा

1
यह खराब सलाह है। यह पूरी तरह से टाइपस्क्रिप्ट और "कुछ आसान पर्याप्त योगदान के लायक है" के सामान्य FOSS दृष्टिकोण की बात को नकारता है। यदि कोई टाइपिंग याद आ रही है, तो किसी की खोज ने इसे किया है और प्रकाशित नहीं किया है या अपने टाइपिंग के साथ एक पीआर सबमिट करें या यदि आप इसे ठीक करना चाहते हैं तो टाइपिंग सिस्टम का उपयोग न करें।
डेव मैकिनटोश

265

यदि आप किसी तृतीय-पक्ष मॉड्यूल का आयात कर रहे हैं 'foo', जो किसी भी प्रकार की लाइब्रेरी में या तो @types/fooपैकेज में उपलब्ध नहीं है, या निश्चित रूप से ( रिपॉजिटरी रिपॉजिटरी से उत्पन्न ), तो आप मॉड्यूल को घोषित करके इस त्रुटि को दूर कर सकते हैं .d.tsएक्सटेंशन के साथ फाइल करें। टाइपस्क्रिप्ट उन .d.tsफ़ाइलों के लिए समान स्थानों की तलाश करता है जो इसे सामान्य .tsफ़ाइलों के लिए देखेंगे : जैसा कि "फ़ाइलों", "शामिल", और "बाहर करना" के तहत निर्दिष्ट किया गया है tsconfig.json

// foo.d.ts
declare module 'foo';

फिर जब आप fooइसे आयात करेंगे तो बस टाइप किया जाएगा any


वैकल्पिक रूप से, यदि आप अपनी खुद की टाइपिंग रोल करना चाहते हैं, तो आप भी कर सकते हैं:

// foo.d.ts
declare module 'foo' {
    export function getRandomNumber(): number
} 

फिर यह सही ढंग से संकलित करेगा:

import { getRandomNumber } from 'foo';
const x = getRandomNumber(); // x is inferred as number

आपको मॉड्यूल के लिए पूर्ण टाइपिंग प्रदान करने की आवश्यकता नहीं है, बस उन बिट्स के लिए पर्याप्त है जो आप वास्तव में उपयोग कर रहे हैं (और इसके लिए उचित टाइपिंग चाहते हैं), इसलिए यदि आप एपीआई की काफी कम मात्रा का उपयोग कर रहे हैं तो यह विशेष रूप से आसान है।


दूसरी ओर, यदि आप बाहरी पुस्तकालयों के प्रकारों के बारे में परवाह नहीं करते हैं और चाहते हैं कि सभी पुस्तकालय बिना टाइपिंग के आयात किए जाएं any, तो आप इसे .d.tsएक्सटेंशन वाली फ़ाइल में जोड़ सकते हैं :

declare module '*';

इसका लाभ (और नकारात्मक) यह है कि आप बिल्कुल कुछ भी आयात कर सकते हैं और टीएस संकलन करेगा।


27
कंपाइलर d.tsफ़ाइलों के लिए कहाँ दिखता है ? आप इस तरह के रूप में किसी भी विन्यास प्रदान करना चाहिए typeRoots?
टॉम

17
@ यह .d.tsउसी फ़ाइलों की तलाश करता है जिसमें यह सामान्य .tsफ़ाइलों के लिए दिखेगा : जैसा कि निर्दिष्ट "फाइलें", "शामिल", और "बाहर" में है tsconfig.json। मैं typeRootsइस उद्देश्य के लिए उपयोग करने की सिफारिश नहीं करूंगा : यह बाहरी प्रकार के मॉड्यूल (यानी node_modules/@types) के स्थान के लिए है , न कि व्यक्तिगत .d.tsफ़ाइलों के लिए।
रतसम

3
मुझे "फ़ाइल foo.d.ts एक मॉड्यूल नहीं है"
नातान एच

2
ऐसा लगता है कि इस वाइल्डकार्ड फ़ाइल की तरह "typings.d.ts" कहा जा करने की जरूरत है
याकूब

4
मुझे यह .d.tsफ़ाइल कहाँ रखनी चाहिए ?
टोनिक्स डेस

127

यदि आपको एक त्वरित सुधार की आवश्यकता है, तो अपने आयात की लाइन से पहले इसे जोड़ें:

// @ts-ignore

7
धन्यवाद, मेरे मामले के लिए सबसे उपयोगी उत्तर।
डेविड

यह अनुलग्‍नक के बाद के संस्करणों में त्रुटि का कारण बनता है:error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Hyililpikonna

91

बस निकालें: लग रहा है जब आप दो दिनों के लिए बाहर देख रहे हैं और इस तरह से यह लगता है कि .jsसे "main": "dist/index.js"में package.jsonऔर सब कुछ ठीक काम करता है!

"main": "dist/index",

UPD : यदि आपके पास अपना npm पैकेज है, तो यह उत्तर सापेक्ष है, यदि नहीं - तो नीचे मेरा उत्तर देखें

और अगर इसके बाद के संस्करण जवाब आयात अपने मॉड्यूल का समाधान नहीं है, बस जोड़ने की कोशिश typingsमें package.json:

"main": "dist/index",
"typings": "dist/index",

बेशक, यहां फ़ोल्डर dist- यह वह जगह है जहां आपके मॉड्यूल की फाइलें संग्रहीत होती हैं।


मैं इन दिनों आपके प्रश्न और आपके उत्तर पर कई बार आया हूं और मैं यह जोड़ना चाहूंगा कि जो मैं याद कर रहा था वह एक .d.ts फ़ाइल में कई प्रकार की घोषणा करना था, इसलिए, मेरे मामले में, स्थापित नोड मॉड्यूल जो बिना आए प्रकार (और मैं उनके प्रकारों की खोजबीन स्थापित करने में असमर्थ था) उन्हें उस फ़ाइल में "घोषित मॉड्यूल 'MYDesiredModule' लिखकर काम करना शुरू कर दिया
जुआन

धन्यवाद। मेरे पैकेज के लिए "टाइपिंग": "डिस्ट / इंडेक्स" जोड़ना, जो मेरे लिए काम कर रहा था। अजीब बात है कि वीएस कोड एक टाइपस्क्रिप्ट त्रुटि फेंकता है जब मैं टाइपस्क्रिप्ट का उपयोग भी नहीं कर रहा हूं
फोक्स

आपके निरीक्षण के लिए धन्यवाद! क्या आप मुझे बता सकते हैं कि अगर मैं परिभाषाओं पर जाने की कोशिश करता हूं तो वीएस कोड की परिभाषा मेरे अपने एनपीएम पैकेज के लिए काम क्यों नहीं करती है? मैंने यहाँ एक प्रश्न बनाया है और अब तक कोई भाग्य नहीं था ... stackoverflow.com/questions/59128917/…
tonix

आपको डिस्ट फ़ोल्डर में फ़ाइल "index.d.ts" जोड़ने की जरूरत है और declare module "moduleName" इस बीच
सनी सन

42

टाइपस्क्रिप्ट मूल रूप से नियमों को लागू कर रहा है और जावास्क्रिप्ट में बाधाओं की कमी के कारण इसे अधिक स्पष्ट और सटीक बनाने के लिए आपके कोड में प्रकार जोड़ रहा है। टाइपस्क्रिप्ट को आपको अपने डेटा का वर्णन करने की आवश्यकता होती है, ताकि कंपाइलर आपके कोड की जांच कर सके और त्रुटियों का पता लगा सके। संकलक आपको बताएगा कि क्या आप बेमेल प्रकार का उपयोग कर रहे हैं, यदि आप अपने दायरे से बाहर हैं या आप एक अलग प्रकार को वापस करने का प्रयास करते हैं। इसलिए, जब आप टाइपस्क्रिप्ट के साथ बाहरी पुस्तकालयों और मॉड्यूल का उपयोग कर रहे हैं, तो उन्हें उस कोड में प्रकारों का वर्णन करने वाली फ़ाइलों को शामिल करना होगा। उन फाइलों को एक्सटेंशन के साथ टाइप डिक्लेरेशन फाइल कहा जाता है d.ts। Npm मॉड्यूल के लिए अधिकांश घोषणा प्रकार पहले से ही लिखे गए हैं और आप उनका उपयोग करके शामिल कर सकते हैं npm install @types/module_name(जहां मॉड्यूल_name उस मॉड्यूल का नाम है, जिसके प्रकार आप शामिल करना चाहते हैं)।

हालाँकि, ऐसे मॉड्यूल हैं जिनकी अपनी परिभाषाएँ नहीं हैं और त्रुटि को दूर करने के लिए और मॉड्यूल का उपयोग करके आयात करने के लिए import * as module_name from 'module-name', typingsअपनी परियोजना की जड़ में एक फ़ोल्डर बनाएं, अपने मॉड्यूल नाम के साथ एक नया फ़ोल्डर बनाएं और उसमें फ़ोल्डर एक module_name.d.tsफ़ाइल बनाएँ और लिखें declare module 'module_name'। इस के बाद सिर्फ अपने लिए जाने के tsconfig.jsonफ़ाइल और जोड़ने "typeRoots": [ "../../typings", "../../node_modules/@types"]में compilerOptions(अपने फ़ोल्डर्स के लिए उचित रिश्तेदार पथ के साथ) जाने के लिए टाइपप्रति पता है, जहां यह अपने पुस्तकालयों और मॉड्यूल के प्रकार परिभाषाओं खोजने के लिए और एक नया संपत्ति जोड़ सकते हैं "exclude": ["../../node_modules", "../../typings"]फाइल करने के लिए। यहाँ एक उदाहरण है कि आपकी tsconfig.json फ़ाइल कैसी दिखनी चाहिए:

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true,
        "outDir": "../dst/",
        "target": "ESNEXT",
        "typeRoots": [
            "../../typings",
            "../../node_modules/@types"
        ]
    },
    "lib": [
            "es2016"
    ],
    "exclude": [
        "../../node_modules",
        "../../typings"
    ]
}

ऐसा करने से, त्रुटि दूर हो जाएगी और आप नवीनतम ES6 और टाइपस्क्रिप्ट नियमों से चिपके रहेंगे।


यह केवल मेरे लिए काम करता है अगर मैंने टाइपिंग फ़ाइल का नाम दिया है index.d.ts। इसके अलावा, यह एकमात्र समाधान था जिसने मेरे लिए सभी दौर में काम किया।
क्रिस हैन्स

21

इसे पढ़ने वाले किसी अन्य व्यक्ति के लिए, .js फ़ाइल को .ts के लिए नाम बदलने का प्रयास करें

संपादित करें: आप "allowJs": trueअपनी tsconfig फ़ाइल में भी जोड़ सकते हैं ।


हाँ, "प्रतिक्रिया-संलयन" के साथ एक ही मुद्दा था और इस समाधान ने एक आकर्षण की तरह काम किया।
yawningphantom

16

यह तरीका मेरे लिए काम करता है:

1. अपनी खुद की घोषणा को एक घोषणा फ़ाइल में जोड़ें जैसे कि index.d.ts (शायद प्रोजेक्ट रूट के तहत)
declare module 'Injector';
2. अपने index.d.ts को tsconfig.json में जोड़ें
  {
    "compilerOptions": {
        "strictNullChecks": true,
        "moduleResolution": "node",
        "jsx": "react",
        "noUnusedParameters": true,
        "noUnusedLocals": true,
        "allowSyntheticDefaultImports":true,
        "target": "es5",
        "module": "ES2015",
        "declaration": true,
        "outDir": "./lib",
        "noImplicitAny": true,
        "importHelpers": true
      },
      "include": [
        "src/**/*",
        "index.d.ts",   // declaration file path
      ],
      "compileOnSave": false
    }

- संपादित करें: मॉड्यूल नाम के आसपास उद्धरण चिह्नों की आवश्यकता है


4

टाइपस्क्रिप्ट में लिखे गए प्रतिक्रिया एप्लिकेशन के साथ नोड मॉड्यूल का उपयोग करते हुए मेरे पास एक ही मुद्दा था। मॉड्यूल का उपयोग करके सफलतापूर्वक स्थापित किया गया था npm i --save my-module। यह जावास्क्रिप्ट में लिखा गया है और एक Clientवर्ग को निर्यात करता है ।

साथ में:

import * as MyModule from 'my-module';
let client: MyModule.Client = new MyModule.Client();

संकलन त्रुटि के साथ विफल रहता है:

Could not find a declaration file for module 'my-module'. 
'[...]/node_modules/my-module/lib/index.js' implicitly has an 'any' type.
  Try `npm install @types/my-module` if it exists or add a new declaration (.d.ts) file containing `declare module 'my-module';`

@types/my-moduleमौजूद नहीं है, इसलिए मैंने सुझाव दिया लाइन के साथ, my-module.d.tsजहां my-moduleआयात किया जाता है, उसके बगल में एक फ़ाइल जोड़ा । मुझे तब त्रुटि मिली:

Namespace '"my-module"' has no exported member 'Client'.

क्लाइंट वास्तव में निर्यात किया जाता है और सामान्य रूप से काम करता है अगर मैं इसे js ऐप में उपयोग करता हूं। साथ ही, पिछला संदेश मुझे बताता है कि कंपाइलर सही फ़ाइल में दिख रहा है ( तत्व /node_modules/my-module/lib/index.jsमें परिभाषित है my-module/package.json "main")।

मैंने संकलक को यह बताकर समस्या हल कर दी कि मुझे निहित के बारे में परवाह नहीं anyहै, अर्थात् , मैं फ़ाइल falseकी निम्न पंक्ति पर सेट हूं tsconfig.json:

    "noImplicitAny": false,

14
मेरा मतलब है, यह काम करता है लेकिन आप अपने बाकी कोड को सख्ती से टाइप करने की क्षमता खो रहे हैं। यह बहुत अच्छा नहीं है।
फ़िलीसिक्लिक

3

आपको ठीक करने के लिए सरल है:

// example.d.ts
declare module 'foo';

यदि आप ऑब्जेक्ट का इंटरफ़ेस घोषित करना चाहते हैं (बड़ी परियोजना के लिए अनुशंसा करें) जिसका आप उपयोग कर सकते हैं:

// example.d.ts
declare module 'foo'{
    // example
    export function getName(): string
}

उसका उपयोग कैसे करें? सरल..

const x = require('foo') // or import x from 'foo'
x.getName() // intellisense can read this

2

मुझे यह भी मिल रहा था, मुझे कुछ समय के लिए चकित कर दिया था, यहां तक ​​कि पहले से ही स्थापित और मेरी आईडीई को कई बार लोड करने वाले प्रकारों के साथ।

मेरे मामले में यह तय हो गया था कि टर्मिनल प्रक्रियाओं को समाप्त करना node_modules, नोड पैकेज प्रबंधक कैश को हटाना , और installफिर संपादक को फिर से लोड करना।


2

दुर्भाग्य से यह हमारे हाथ से बाहर है कि क्या पैकेज लेखक एक घोषणा फ़ाइल के साथ परेशान है। मेरे पास क्या करने के लिए एक फाइल है, index.d.tsजिसमें विभिन्न पैकेजों से सभी लापता घोषणा फाइलें शामिल होंगी:

Index.ts:

declare module 'v-tooltip';
declare module 'parse5';
declare module 'emoji-mart-vue-fast';

0

यह वही है जो मैंने काम किया है।

npm install --save readline


0

मैंने यहां सब कुछ करने की कोशिश की है, लेकिन मेरे लिए यह एक पूरी तरह से अलग मुद्दा था: मुझे अपने *.d.tsकिसी भी आयात विवरण से हटाना था :

import { SomeModuleType } from '3rd-party-module';

त्रुटि दूर करने के बाद चला गया ...

स्पष्टीकरण : जब हम एक में एक मॉड्यूल की घोषणा *.d.tsफ़ाइल, यह स्वचालित रूप से टाइपप्रति संकलक द्वारा एक के रूप में चुना है परिवेश मॉड्यूल (एक आप स्पष्ट रूप से आयात की जरूरत नहीं है)। एक बार जब हम निर्दिष्ट करते हैं import ... from ..., तो फ़ाइल अब एक सामान्य (ES6) मॉड्यूल बन जाती है, और इसलिए स्वचालित रूप से नहीं ली जाएगी। इसलिए यदि आप अभी भी इसे एक परिवेश मॉड्यूल के रूप में व्यवहार करना चाहते हैं, तो एक अलग आयात शैली का उपयोग करें:

type MyType: import('3rd-party-module').SomeModuleType;

-4

बस आप निम्नलिखित कोड के रूप में आवश्यकता का उपयोग करके इसे आयात कर सकते हैं:

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