टाइपस्क्रिप्ट से एनपीएम मॉड्यूल का उपभोग कैसे करें?


90

मैं टाइपस्क्रिप्ट पर एक शॉट दे रहा हूं। यह हैलो वर्ल्ड स्टेज में ठीक काम करता है। मैं अब एक npm मॉड्यूल का उपयोग करने की कोशिश कर रहा हूं:

index.ts =

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

यह काम नहीं करता है:

  • tsc index.ts -> Cannot find module 'lodash'. (2307)
  • node-ts index.js -> Cannot find module 'lodash'. (2307)

टाइपस्क्रिप्ट प्रलेखन को देखने और गूगल में मदद नहीं की। अन्य S / O प्रश्न अनुत्तरित ( यहाँ और यहाँ ) या असंबंधित हैं।

तत्व:

  • टाइपस्क्रिप्ट 1.8 नवीनतम
  • हाँ, लॉशश स्थापित है npm i --save lodashऔर मेरे फाइल सिस्टम में मौजूद है (जाँची गई)
  • मैंने भी किया typings i --save lodash
  • वेरिएंट import * as _ from 'lodash'या const _ = require('lodash')तो काम नहीं करते हैं
  • मैंने tsconfig.json विकल्पों को चुनने की कोशिश की जैसा कि अन्य उत्तरों में सुझाया गया है "moduleResolution": "node"और "module": "commonjs"जैसा कि कुछ उत्तरों में सुझाया गया है, फिर भी काम नहीं करता है

हम टाइपस्क्रिप्ट में एक npm पैकेज का उपभोग कैसे करते हैं ??


2
क्या आपने अपने index.ts में lodash.d.ts का संदर्भ जोड़ा है? यह इसी तरह दिखना चाहिए: ///<reference path="../typings/lodash/lodash.d.ts"/>
ग्रैनगा

@ ग्रेनागा यह काम करता है। क्या आप इसे उत्तर के रूप में जोड़ सकते हैं?
14

2
खुशी है कि यह काम करता है। ब्लैकस ने पहले ही जवाब जोड़ दिया है और यह निर्दिष्ट करता है कि मैंने क्या बेहतर सुझाव दिया है। एक नोट हालांकि: जब इनपुट फाइल कमांड लाइन (जो आपका मामला है) पर निर्दिष्ट की जाती है, तो tsconfig.json फाइलें नजरअंदाज कर दी जाती हैं। ( स्रोत )
ग्रैन्गा जूल

जवाबों:


61

[संपादित] इस उत्तर के लिए बहुत बहुत धन्यवाद! हालांकि, 2018 तक, यह पुराना है। पाठकों, अन्य उत्तरों पर एक नज़र डालें।

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

  • यदि आपके पास टाइपिंग है और आप a का उपयोग नहीं करते हैं tsconfig.json, referenceतो टाइपिंग आयात करने के लिए उपयोग करें:

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • यदि आप किसी tsconfig.jsonफ़ाइल का उपयोग कर रहे हैं , तो अपनी टाइपिंग फ़ाइल को शामिल करना सुनिश्चित करें (या बाहर नहीं किया गया, आपकी पसंद), और importपिछले उदाहरण पर पसंद करें।

मामले में जब उपलब्ध टंकण नहीं होता है। आपके पास दो विकल्प हैं: किसी .d.tsफ़ाइल पर अपना स्वयं का लिखना , या लाइब्रेरी के लिए टाइप चेकिंग को अनदेखा करना।

प्रकार की जाँच को पूरी तरह से अनदेखा करने के लिए (यह अनुशंसित तरीका नहीं है), लाइब्रेरी को प्रकार के चर पर आयात करें any

 const _: any = require('lodash');

 console.log(_.toUpper('Hello, world !'))

tscशिकायत करेंगे जो requireमौजूद नहीं है। nodeटाइपिंग प्रदान करें , या declareयह त्रुटि को छोड़ने के लिए।


2
3 समाधान के साथ पूरा जवाब। +1
ऑफीरो

जोड़: यह तब तक भी काम करता है ts-nodeजब तक कि टाइपिंग इंडेक्स को संदर्भित नहीं किया जाता हैtsconfig.json
ऑफ्मो

Im का मतलब है कि आप इसे "त्रुटि को त्यागने की घोषणा करें" से भ्रमित हैं। क्या मुझे उस मॉड्यूल में यह बदलाव करने की आवश्यकता है जिसे मैं आयात करने की कोशिश कर रहा हूं?
स्लग

1
यह उत्तर गंभीर रूप से पुराना है। मेरे नए जवाब के नीचे देखें stackoverflow.com/a/53786892/587407
Offirmo

50

[२०१ ,/१२] नई, अप-टू-डेट, इस सवाल का जवाब मैंने २०१६ में पूछा था, जो आउटडेटेड जवाब होने के बावजूद बहुत सी गतिविधि दिखाता है।

लंबी कहानी संक्षेप में, टाइपस्क्रिप्ट को आपके पैकेज के कोड के बारे में टाइप करने की आवश्यकता होती है (उर्फ " प्रकार की घोषणा फाइलें " उर्फ ​​"टाइपिंग") और सही ढंग से आपको बताता है कि आप अन्यथा टाइपस्क्रिप्ट के पूरे बिंदु को खो देंगे। सर्वोत्तम अभ्यास के क्रम में उन्हें सूचीबद्ध करने के लिए, उन्हें प्रदान करने या उनमें से चुनने के लिए कई समाधान हैं:


समाधान 0 : मॉड्यूल पहले से ही टाइपिंग प्रदान करता है। अगर इसके पैकेज.जॉन में इस तरह की एक पंक्ति है:

"typings": "dist/index.d.ts",

यह पहले से ही टाइपस्क्रिप्ट-सक्षम है। यदि आप इस पृष्ठ को पढ़ रहे हैं तो यह सबसे अधिक संभावना नहीं है, तो चलिए जारी रखते हैं ...


समाधान 1 : निश्चित रूप से Typed से समुदाय-समर्थित टाइपिंग का उपयोग करें । एक मॉड्यूल "फू" के लिए, यह प्रयास करें:

npm add -D @types/foo

अगर यह काम करता है, खजाना! अब आपके पास टाइपिंग है और आप अपने मॉड्यूल का उपयोग कर सकते हैं। यदि npm शिकायत करता है कि यह मॉड्यूल @ प्रकार / फू नहीं पा सकता है, तो जारी रखें ...


समाधान 2 : इस मॉड्यूल के बारे में कस्टम टाइपिंग प्रदान करें। (शून्य प्रयास करने के लिए एक विकल्प के साथ)

  1. अपनी परियोजना के मूल में "टाइपिंग-कस्टम" नामक एक फ़ोल्डर बनाएं
  2. इस फ़ोल्डर की सामग्री को अपने tsconfig.json में देखें:
"include": [
    "./typings-custom/**/*.ts"
]
  1. इस सटीक नाम के साथ एक फ़ाइल बनाएँ: foo.d.ts [foo = मॉड्यूल का नाम] सामग्री के साथ:
declare module 'foo'

आपका टाइपस्क्रिप्ट कोड अब संकलित होना चाहिए, यद्यपि प्रकार की जानकारी के साथ (टाइपस्क्रिप्ट "किसी भी" प्रकार के फू मॉड्यूल पर विचार करें)।

आप आधिकारिक डॉक और / या निश्चित रूप से उदाहरण से देख कर टाइप जानकारी स्वयं लिखने का प्रयास कर सकते हैं । यदि आप करते हैं, तो अपने टाइपिंग को सीधे मॉड्यूल में योगदान करने के बारे में सोचें (समाधान 0, यदि मॉड्यूल लेखक स्वीकार करता है) या निश्चित रूप से (समाधान 1) में


1
@ ओफ़र्मो, हम एक ही फ़ाइल में कई कस्टम टाइपिंग भी घोषित कर सकते हैं! तो, कई फ़ाइलों (शायद?) के लिए कोई ज़रूरत नहीं है।
लाजिफ़िकेर

चरण 2. Reference the content of this folder in your tsconfig.json:निम्नलिखित त्रुटि देता है: Unknown compiler option 'include'.
सुमित

1
@ सुमित यह एक संकलक विकल्प नहीं है, यह एक भाई-बहन होना चाहिएcompilerOptions
ऑफिरमो

22

आप शायद घोषणा फ़ाइलें याद कर रहे हैं ।

अधिक जानकारी के लिए निश्चित रूप से देखें ।


इसे इस्तेमाल करे:

npm install --save lodash
npm install --save @types/lodash

अब आप आयात कर सकते हैं।

import _ from 'lodash';

यदि आपके द्वारा आयात किए जा रहे मॉड्यूल में कई निर्यात हैं , तो आप ऐसा कर सकते हैं:

import { Express, Router } from 'express';

यदि आप जो मॉड्यूल आयात कर रहे हैं, "उसका कोई डिफ़ॉल्ट निर्यात नहीं है" तो आपको यह करने की आवश्यकता है:

import * as http from 'http';

हमें ईएस 6 कोड के समान * as _ही क्यों और कैसे उपयोग करना है _ from 'lodash'?
जॉनी क्यू

@ जॉनीक्यू अच्छी बात है। import _ from 'lodash';इस मामले में उपयोग करना बेहतर है। मैंने आयात करने के विभिन्न तरीके दिखाने के लिए अपना जवाब अपडेट किया है और आप उनका उपयोग क्यों करेंगे।
डेरेक सोइक

1
* as _ की जरूरत है जहां मॉड्यूल कोई डिफ़ॉल्ट निर्यात किया जाता है। Tsc संकलक इस की चेतावनी देगा।
14:28 पर user2867342

'नो डिफॉल्ट एक्सपोर्ट' से इसका मतलब यह है कि कोई टाइपस्क्रिप्ट प्रकार परिभाषित नहीं है (यानी एक सादे जावास्क्रिप्ट मॉड्यूल आयात करना)? मैं जेएस / टाइपस्क्रिप्ट के लिए नया हूं ....
बिग रिच

2
@BigRich "कोई डिफ़ॉल्ट निर्यात नहीं" का अर्थ है कि मॉड्यूल में कोई export default <...>वक्तव्य नहीं है । टाइपस्क्रिप्ट मॉड्यूल प्रलेखन के "डिफ़ॉल्ट निर्यात" अनुभाग पर एक नज़र डालें ।
डेरेक सोइक

4

इसने मेरे लिए काम किया।

  1. "टाइपिंग" नामक एक फ़ोल्डर बनाएँ।
  2. टाइपिंग फ़ोल्डर में, एक फ़ाइल नाम मॉड्यूल-name.d.ts बनाएं । इसमें शामिल है:

    declare module "module-name";

  3. Tsconfig.json में, फ़ोल्डर देखें

    "typeRoots": [ "./typings", "../node_modules/@types" ]


नमस्ते! योगदान के लिए धन्यवाद। यह विधि पहले से ही मेरे उत्तर में शामिल है और इसका उपयोग केवल अंतिम उपाय के रूप में किया जाना चाहिए।
ऑफिरमो

चरण 3:, In tsconfig.json, refer to the folderनिम्न त्रुटि देता है:Unknown compiler option 'typesRoots'.
सुमित

1
मेरे मामले में @Sitit, "typeRoots" "संकलनकर्ता" के अंदर है
Quynh Ngo

1
यह टाइपरूट नहीं है टाइप टाइप करें, और कंपाइलर के अंदर होना चाहिए
CM

0

मुझे यह त्रुटि मिल रही है और मेरे जवाब में से किसी ने भी मेरे लिए काम नहीं किया है, लेकिन जब आप इसे टाइप इनस्क्रिप्ट में नोड मॉड्यूल के साथ काम करना चाहते हैं तो मुझे कुछ पता लगाना चाहिए

$npm install @types/<module_name>

उदाहरण के लिए

npm install @types/cheerio

कहने के बजाय

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