दुर्भाग्य से ये चीजें वर्तमान में बहुत अच्छी तरह से प्रलेखित नहीं हैं, लेकिन भले ही आप इसे काम करने में सक्षम थे, चलो अपने कॉन्फ़िगरेशन पर जाएं ताकि आप समझ सकें कि प्रत्येक भाग क्या कर रहा है और यह कैसे टाइपस्क्रिप्ट प्रक्रियाओं और टाइपिंग लोड करने से संबंधित है।
पहले आप जो त्रुटि प्राप्त कर रहे हैं, उस पर चलें:
error TS2688: Cannot find type definition file for 'lodash'.
यह त्रुटि वास्तव में आपके ts फ़ाइलों में कहीं भी अपने आयात या संदर्भ या अपने रिकॉर्ड को उपयोग करने के प्रयास से नहीं आ रही है। बल्कि यह गलतफहमी से आ रहा है कि गुणों typeRoots
और types
गुणों का उपयोग कैसे किया जाए, तो चलिए उन पर थोड़ा और विस्तार करते हैं।
typeRoots:[]
और types:[]
गुणों के बारे में बात यह है कि वे मनमाने ढंग से घोषणा ( ) फ़ाइलों को लोड करने के लिए सामान्य-उद्देश्य तरीके नहीं हैं *.d.ts
।
ये दो गुण सीधे नई टीएस 2.0 सुविधा से संबंधित हैं जो एनपीएम पैकेज से पैकेजिंग और लोडिंग टाइपिंग घोषणाओं की अनुमति देता है ।
यह समझना बहुत महत्वपूर्ण है, कि ये केवल एनपीएम प्रारूप में फ़ोल्डर के साथ काम करते हैं (अर्थात एक पैकेज से युक्त फ़ोल्डर । json या index.dts ।)।
इसके लिए डिफ़ॉल्ट typeRoots
है:
{
"typeRoots" : ["node_modules/@types"]
}
डिफ़ॉल्ट रूप से इसका मतलब यह है कि टाइपस्क्रिप्ट node_modules/@types
फ़ोल्डर में जाएगा और प्रत्येक उप-फ़ोल्डर को लोड करने का प्रयास करेगा जो इसे npm पैकेज के रूप में मिलता है ।
यह समझना महत्वपूर्ण है कि यह विफल हो जाएगा यदि किसी फ़ोल्डर में एनपीएम पैकेज जैसी संरचना नहीं है।
यह आपके मामले में हो रहा है, और आपकी प्रारंभिक त्रुटि का स्रोत है।
आपने टाइप किया है टाइप करें:
{
"typeRoots" : ["./typings"]
}
इसका अर्थ है कि टाइपस्क्रिप्ट अब सबफ़ोल्डर के./typings
लिए फ़ोल्डर को स्कैन करेगा और इसे npm मॉड्यूल के रूप में मिलने वाले प्रत्येक सबफ़ोल्डर को लोड करने का प्रयास करेगा।
तो चलिए आपको दिखाते हैं कि आपके पास सिर्फ typeRoots
पॉइंट करने के लिए सेटअप था ./typings
लेकिन अभी तक कोई types:[]
प्रॉपर्टी सेटअप नहीं था । आप संभवतः इन त्रुटियों को देखेंगे:
error TS2688: Cannot find type definition file for 'custom'.
error TS2688: Cannot find type definition file for 'global'.
ऐसा इसलिए है क्योंकि tsc
आपके ./typings
फ़ोल्डर को स्कैन कर रहा है और उप-फ़ोल्डर ढूंढ रहा है custom
और global
। यह तो NPM पैकेज प्रकार टाइपिंग के रूप में इन व्याख्या करने के लिए कोशिश कर रहा है, लेकिन कोई है index.d.ts
या package.json
इन फ़ोल्डर में हैं और इसलिए आप त्रुटि मिलती है।
अब types: ['lodash']
आप जिस प्रॉपर्टी को सेट कर रहे हैं, उसके बारे में थोड़ा बात करते हैं। यह क्या करता है? डिफ़ॉल्ट रूप से, टाइपस्क्रिप्ट सभी उप-फ़ोल्डर्स को लोड करेगा जो आपके भीतर पाता है typeRoots
। यदि आप एक types:
संपत्ति निर्दिष्ट करते हैं तो यह केवल उन विशिष्ट उप-फ़ोल्डरों को लोड करेगा।
आपके मामले में आप इसे ./typings/lodash
फ़ोल्डर को लोड करने के लिए कह रहे हैं लेकिन यह मौजूद नहीं है। यही कारण है कि आप प्राप्त करते हैं:
error TS2688: Cannot find type definition file for 'lodash'
तो आइए संक्षेप में जानें कि हमने क्या सीखा है। टाइपस्क्रिप्ट 2.0 पेश किया typeRoots
और npm संकुलtypes
में पैक की गई घोषणा फाइलों को लोड करने के लिए । यदि आपके पास कस्टम टाइपिंग या एकल ढीली d.ts
फाइलें हैं जो npm पैकेज सम्मेलनों के बाद एक फ़ोल्डर के साथ समाहित नहीं हैं, तो ये दो नए गुण हैं जो आप उपयोग नहीं करना चाहते हैं। टाइपस्क्रिप्ट 2.0 वास्तव में नहीं बदलता है कि इनका सेवन कैसे किया जाएगा। आपको इन फ़ाइलों को अपने संकलन संदर्भ में कई मानक तरीकों में शामिल करना होगा:
सीधे इसमें एक .ts
फ़ाइल :
///<reference path="../typings/custom/lodash.d.ts" />
समेत ./typings/custom/lodash.d.ts
अपनी files: []
संपत्ति में ।
समेत ./typings/index.d.ts
अपने में files: []
संपत्ति (जो तब रिकर्सिवली अन्य typings भी शामिल है।
जोड़ा जा रहा है ./typings/**
अपने सेincludes:
उम्मीद है, इस चर्चा के आधार पर आप यह बता पाएंगे कि आपके द्वारा tsconfig.json
किए गए कामों के लिए आप फिर से क्यों काम करते हैं।
संपादित करें:
एक बात है कि मैं उल्लेख करना भूल गया है कि है typeRoots
और types
संपत्ति वास्तव में के लिए ही उपयोगी हैं स्वत: वैश्विक घोषणाओं के लोड हो रहा है।
उदाहरण के लिए यदि आप
npm install @types/jquery
और आप डिफ़ॉल्ट tsconfig का उपयोग कर रहे हैं, फिर उस jquery प्रकार के पैकेज को स्वचालित रूप से लोड किया $
जाएगा और आपके सभी लिपियों में उपलब्ध होगा जो किसी भी तरह से आगे करना होगा ///<reference/>
याimport
typeRoots:[]
संपत्ति कहाँ से प्रकार अतिरिक्त स्थानों को जोड़ने के लिए है संकुल स्वचालित रूप से frrom लोड किया जाएगा।
types:[]
संपत्ति के प्राथमिक यूज-केस स्वत: लोड हो रहा है व्यवहार को निष्क्रिय करने के (एक खाली सरणी के लिए निर्धारित कर उस) है, और उसके बाद ही आप विश्व स्तर पर शामिल करना चाहते हैं विशिष्ट प्रकार लिस्टिंग।
विभिन्न प्रकार से पैकेज को लोड करने का दूसरा तरीका typeRoots
नए ///<reference types="jquery" />
निर्देश का उपयोग करना है । के types
बजाय नोटिस करें path
। फिर, यह केवल वैश्विक घोषणा फ़ाइलों के लिए उपयोगी है, आमतौर पर जो ऐसा नहीं करते हैं import/export
।
अब, यहां उन चीजों में से एक है जिनके साथ भ्रम होता है typeRoots
। याद रखें, मैंने कहा कि typeRoots
मॉड्यूल के वैश्विक समावेश के बारे में है। लेकिन @types/folder
मानक मॉड्यूल-रिज़ॉल्यूशन में भी शामिल है (आपकी परवाह किए बिना)typeRoots
सेटिंग ) ।
विशेष रूप से, स्पष्ट रूप से आयात करने मॉड्यूल हमेशा सभी को नजरअंदाज includes
, excludes
, files
,typeRoots
और types
विकल्प। तो जब आप करते हैं:
import {MyType} from 'my-module';
उपर्युक्त सभी गुणों को पूरी तरह से अनदेखा किया गया है। मॉड्यूल रिज़ॉल्यूशन के दौरान प्रासंगिक गुण हैंbaseUrl
, paths
, और moduleResolution
।
मूल रूप से, node
मॉड्यूल रिज़ॉल्यूशन का उपयोग करते समय , यह फ़ाइल नाम की खोज करना शुरू कर देगा my-module.ts
,my-module.tsx
, my-module.d.ts
फ़ोल्डर पर शुरू आपके द्वारा की ओर इशारा किया baseUrl
विन्यास।
यदि यह फ़ाइल नहीं ढूंढता है, तो यह नाम के एक फ़ोल्डर की तलाश करेगा my-module
और फिर package.json
एक typings
संपत्ति के साथ खोज करेगा , अगर वहाँ हैpackage.json
कोई typings
संपत्ति या नहीं यह बताने के लिए कि इसे लोड करने के लिए कौन सी फ़ाइल हैindex.ts/tsx/d.ts
उस फ़ोल्डर के भीतर ।
अगर वह अभी भी सफल नहीं है, तो यह इन्हीं चीजों की खोज करेगा node_modules
आपके लिए शुरू होने फ़ोल्डरbaseUrl/node_modules
।
इसके अलावा, अगर यह इन नहीं मिलता है, यह खोज करेंगे baseUrl/node_modules/@types
सभी समान चीजों की ।
यदि यह अभी भी कुछ भी नहीं मिला, तो यह मूल निर्देशिका और खोज में जाना शुरू कर देगा node_modules
औरnode_modules/@types
वहां । यह तब तक निर्देशिकाओं को जारी रखेगा, जब तक यह आपकी फ़ाइल प्रणाली (यहां तक कि आपके प्रोजेक्ट के बाहर नोड-मॉड्यूल प्राप्त करना) तक नहीं पहुंचता।
एक बात जिस पर मैं जोर देना चाहता हूं, वह यह है कि मॉड्यूल रेजोल्यूशन किसी भी चीज को पूरी तरह से नजरअंदाज कर देता है typeRoots
आपके द्वारा निर्धारित सेट को । इसलिए यदि आपने कॉन्फ़िगर किया है typeRoots: ["./my-types"]
, तो यह स्पष्ट मॉड्यूल रिज़ॉल्यूशन के दौरान खोजा नहीं जाएगा। यह केवल एक फ़ोल्डर के रूप में कार्य करता है जहां आप वैश्विक परिभाषा फ़ाइलों को डाल सकते हैं जिन्हें आप पूरे एप्लिकेशन को बिना आयात या संदर्भ के उपलब्ध कराना चाहते हैं।
अंत में, आप पथ मैपिंग (अर्थात paths
संपत्ति) के साथ मॉड्यूल व्यवहार को ओवरराइड कर सकते हैं । इसलिए, उदाहरण के लिए, मैंने उल्लेख किया कि किसी typeRoots
मॉड्यूल को हल करने की कोशिश करते समय किसी भी कस्टम से परामर्श नहीं किया जाता है। लेकिन अगर आपको पसंद आया तो आप इस व्यवहार को ऐसा बना सकते हैं:
"paths" :{
"*": ["my-custom-types/*", "*"]
}
यह उन सभी आयातों के लिए है जो बाएं हाथ की ओर से मेल खाते हैं, आयात को संशोधित करने का प्रयास करें जैसा कि इसे शामिल करने का प्रयास करने से पहले दाईं ओर आयात करें ( *
दाहिने हाथ की तरफ आपके प्रारंभिक आयात स्ट्रिंग का प्रतिनिधित्व करता है। उदाहरण के लिए यदि आप आयात करते हैं:
import {MyType} from 'my-types';
यह पहले आयात की कोशिश करेगा जैसे कि आपने लिखा था:
import {MyType} from 'my-custom-types/my-types'
और फिर अगर यह नहीं मिला तो यह फिर से उपसर्ग को हटाने की कोशिश करेगा (सरणी में दूसरा आइटम बस है *
जो प्रारंभिक आयात का मतलब है।
तो इस तरह से आप कस्टम फोल्डर को कस्टम डिक्लेरेशन फाइल्स या यहां तक कि कस्टम .ts
मॉड्यूल्स की खोज के लिए जोड़ सकते हैं जिन्हें आप सक्षम करना चाहते हैंimport
।
आप विशिष्ट मॉड्यूल के लिए कस्टम मैपिंग भी बना सकते हैं:
"paths" :{
"*": ["my-types", "some/custom/folder/location/my-awesome-types-file"]
}
यह आपको करने देगा
import {MyType} from 'my-types';
लेकिन फिर उन प्रकारों को पढ़ें some/custom/folder/location/my-awesome-types-file.d.ts
paths
से क्या और कैसे अलग हैinclude
?