মডিউল 'মডিউল-নাম' এর জন্য কোনও ঘোষণার ফাইল খুঁজে পাওয়া যায়নি। '/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"

নোড.জেজে সব কিছু ঠিকঠাক কাজ করে তবে টাইপস্ক্রিপ্ট:

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
আপনি যদি নামটি খুঁজে না পান তবে npm install @types/node --save-dev
টাইপস্ক্রিপ্ট

120
মডিউলটিতে @ টাইপ প্যাকেজ না থাকলে কী হবে?
ড্যানিয়েল কুমাক

37
আমি মনে করি এর requireপরিবর্তে ব্যবহার করা importকিছুটা অ্যান্টি-প্যাটার্ন: কোনও .d.tsফাইলে মডিউলটি ঘোষণা করা ভাল ; নীচে আমার উত্তর দেখুন।
রিটসাম

2
ব্যবহারের উদাহরণ: const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
সেজেড্ডা

1
এটি খারাপ পরামর্শ। এটি সম্পূর্ণরূপে টাইপস্ক্রিপ্টের বিন্দু এবং "যথেষ্ট সহজ কিছুকে অবদানের জন্য মূল্যবান" এর সাধারণ FOSS দৃষ্টিভঙ্গিকে উপেক্ষা করে। যদি কোনও টাইপিংয়ের অনুপস্থিত থাকে তবে কারও অনুসন্ধান এটি করেছে এবং প্রকাশ করেছে বা আপনার টাইপগুলির সাথে একটি পিআর জমা দেয় না বা টাইপিং সিস্টেমটি ব্যবহার না করে যদি আপনি কেবল এটির সমাধান করতে চান।
ডেভ ম্যাকিনটোস

265

আপনি যদি কোনও তৃতীয় পক্ষের মডিউল আমদানি 'foo'করে যা কোনও লাইব্রেরিতেই বা @types/fooপ্যাকেজে কোনও টাইপ সরবরাহ করে না ( DefinitelyTyped সংগ্রহস্থলের), তারপর এই ত্রুটি একটি মডিউল ঘোষণা করে দূরে যেতে করতে পারেন একটি .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ফাইল নয় intended
রিটসাম

3
আমি পেয়েছি "ফাইল foo.d.ts একটি মডিউল নয়"
নাথান এইচ

2
দেখে মনে হচ্ছে এই ওয়াইল্ডকার্ড ফাইলটিকে "typings.d.ts" বলা দরকার
জ্যাকব

4
আমার এই .d.tsফাইলটি কোথায় রাখা উচিত ?
টোনিক্স

126

যদি আপনার দ্রুত সমাধানের প্রয়োজন হয় তবে কেবল আপনার আমদানির লাইনের আগে এটি যুক্ত করুন:

// @ts-ignore

7
ধন্যবাদ, আমার মামলার জন্য সবচেয়ে দরকারী উত্তর।
ডেভিড

এটি এসিলিন্টের পরবর্তী সংস্করণগুলিতে একটি ত্রুটির কারণ ঘটায়:error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
হাইকিলপিকোণা

91

শুধু সরান: বোধ যখন আপনি দুই দিনের জন্য বাইরে খুঁজছি হয় এবং এর মতো এটিকে যে .jsথেকে "main": "dist/index.js"package.jsonএবং সবকিছু ঠিক কাজ করে!

"main": "dist/index",

ইউপিডি : আপনার নিজের এনপিএম প্যাকেজ থাকলে এই উত্তরটি আপেক্ষিক, যদি না হয় - নীচে আমার উত্তরটি দেখুন

যদি উপরে উত্তর আমদানি আপনার মডিউল সমাধান না, শুধু যোগ চেষ্টা typingsমধ্যে package.json:

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

অবশ্যই, এখানে ফোল্ডার dist- এটি যেখানে আপনার মডিউলটির ফাইলগুলি সঞ্চয় করে।


আমি এই গত দিনগুলিতে আপনার প্রশ্নে এবং আপনার জবাবটি অনেকবার এসেছি এবং আমি যুক্ত করতে চাই যে আমি যা অনুপস্থিত ছিল তা হল .d.ts ফাইলে এই ধরণের প্রকারগুলি ঘোষণা করা, সুতরাং, আমার ক্ষেত্রে, ইনস্টল নোড মডিউলগুলি ছাড়া এসেছিল declare প্রকারগুলি (এবং আমি তাদের ধরণের ধরণগুলি ইনস্টল করতে অক্ষম হয়েছি) "ফাইলগুলি মাইডিডায়ারড মডিউল" ঘোষণা করে সেই ফাইলটিতে তাদের ঘোষণার মাধ্যমে কাজ শুরু করে
জুয়ান

ধন্যবাদ। আমার প্যাকেজটিতে "টাইপিংস": "ডিস্ট / ইনডেক্স" যুক্ত করা হয়েছে j জসন আমার পক্ষে কাজ করেছিল। অদ্ভুত যে ভিএস কোড একটি টাইপ
স্ক্রিপ্ট

আপনার মতামতে জন্য ধন্যবাদ! আপনি কি দয়া করে আমাকে বলতে পারেন কেন আমি সংজ্ঞাগুলিতে যাওয়ার চেষ্টা করলে ভিএস কোড সংজ্ঞাগুলি আমার নিজের এনপিএম প্যাকেজের জন্য কাজ করে না? আমি একটি প্রশ্ন এখানে তৈরি করেছেন এবং কোন ভাগ্য এতদূর ... ছিল stackoverflow.com/questions/59128917/...
tonix

আপনাকে ডিস্ট ফোল্ডারে "index.d.ts" ফাইলটি যুক্ত করতে হবে declare module "moduleName" এবং এর মধ্যে রাখতে হবে
সানি সান

একটি মোহন মত কাজ, ধন্যবাদ!
করণ টিক্কু

42

টাইপস্ক্রিপ্ট মূলত জাভাস্ক্রিপ্টে সীমাবদ্ধতার অভাবে এটি আরও স্পষ্ট এবং আরও নির্ভুল করতে আপনার কোডগুলিতে নিয়মগুলি প্রয়োগ করছে এবং প্রকারগুলি যুক্ত করছে। টাইপস্ক্রিপ্টের জন্য আপনাকে আপনার ডেটা বর্ণনা করা দরকার, যাতে সংকলকটি আপনার কোডটি পরীক্ষা করে ত্রুটিগুলি খুঁজে পেতে পারে। আপনি যদি আপনার সুযোগের বাইরে না থাকেন বা আপনি কোনও অন্য রকমের ফেরত দেওয়ার চেষ্টা করেন তবে সংযোজনকারীটি আপনাকে জানায় না mis সুতরাং, আপনি যখন টাইপস্ক্রিপ্ট সহ বাহ্যিক গ্রন্থাগার এবং মডিউলগুলি ব্যবহার করছেন তখন তাদের এমন ফাইল থাকা দরকার যা সেই কোডের প্রকারগুলি বর্ণনা করে। এই ফাইলগুলিকে এক্সটেনশন সহ টাইপ ডিক্লেয়ারেশন ফাইল বলা হয় d.ts। এনপিএম মডিউলগুলির জন্য বেশিরভাগ ঘোষণার ধরণগুলি ইতিমধ্যে লিখিত এবং আপনি সেগুলি ব্যবহার করে অন্তর্ভুক্ত করতে পারেন npm install @types/module_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 ফাইলটি যুক্ত করতে পারেন ।


হ্যাঁ, "বিক্রিয়া-ফিউশনচার্টস" নিয়ে একই সমস্যা ছিল এবং এই সমাধানটি মনোমুগ্ধকর মতো কাজ করেছিল worked
yawningphantom

16

এইভাবে আমার জন্য কাজ করে:

1. একটি ডিক্লেয়ারেশন ফাইলে আপনার নিজস্ব ঘোষণা যুক্ত করুন যেমন সূচি.ড.টিস (সম্ভবত প্রকল্পের মূলের নীচে)
declare module 'Injector';
২. tsconfig.json এ আপনার index.d.ts যুক্ত করুন
  {
    "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'.

ক্লায়েন্টটি আসলে রফতানি হয় এবং আমি যদি এটি কোনও জেএস অ্যাপে ব্যবহার করি তবে স্বাভাবিকভাবে কাজ করে। এছাড়াও, পূর্ববর্তী বার্তাটি আমাকে বলেছে যে সংকলকটি সঠিক ফাইলটিতে সন্ধান করছে ( উপাদানটিতে /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

আমি এখানে সবকিছু চেষ্টা করেছি, তবে আমার কাছে এটি সম্পূর্ণ আলাদা সমস্যা ছিল: আমার *.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');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.