आप किसी मौजूदा जावास्क्रिप्ट लाइब्रेरी से .d.ts "टाइपिंग" परिभाषा फ़ाइल का उत्पादन कैसे करते हैं?


192

मैं अपनी और अपनी पार्टी दोनों के लिए बहुत सारे पुस्तकालयों का उपयोग कर रहा हूं। मैं देख रहा हूँ कि "टाइपिंग" निर्देशिका में Jquery और WinRT के लिए कुछ हैं ... लेकिन वे कैसे बनाई जाती हैं?

जवाबों:


232

आपके लिए प्रश्न में पुस्तकालय के आधार पर कुछ विकल्प उपलब्ध हैं, यह कैसे लिखा जाता है, और आप किस स्तर की सटीकता की तलाश कर रहे हैं। आइए विकल्पों की समीक्षा करें, मोटे तौर पर वांछनीयता के अवरोही क्रम में।

शायद यह पहले से ही मौजूद है

हमेशा पहले निश्चित रूप से जाँच करें ( https://github.com/DefinitelyTyped/DefinitelyTyped ) पहले। यह वस्तुतः हजारों .d.ts फ़ाइलों से भरा एक सामुदायिक रेपो है और यह बहुत संभावना है कि आप जिस चीज का उपयोग कर रहे हैं वह पहले से ही है। आपको TypeSearch ( https://microsoft.github.io/TypeSearch/ ) भी जांचना चाहिए जो NPM- प्रकाशित .d.ts फ़ाइलों के लिए एक खोज इंजन है; यह निश्चित रूप से निश्चित रूप से की तुलना में थोड़ा अधिक परिभाषाएँ होगी। कुछ मॉड्यूल अपने एनपीएम वितरण के हिस्से के रूप में अपनी स्वयं की परिभाषाओं को भी शिपिंग कर रहे हैं, इसलिए यह भी देखें कि क्या अपना लिखने की कोशिश करने से पहले ऐसा है।

शायद तुम एक की जरूरत नहीं है

टाइपस्क्रिप्ट अब --allowJsध्वज का समर्थन करता है और .js फ़ाइलों में अधिक JS- आधारित इंफ़ेक्शन बना देगा। आप अपने संकलन में .js फ़ाइल सहित कोशिश कर सकते --allowJsहैं कि यह देखने के लिए कि क्या यह आपको पर्याप्त प्रकार की जानकारी देता है। टाइपस्क्रिप्ट इन फ़ाइलों में ईएस 5-शैली की कक्षाओं और जेएसडीओसी टिप्पणियों जैसी चीजों को पहचानेंगे, लेकिन अगर पुस्तकालय खुद को एक अजीब तरीके से शुरू करता है, तो यह हो सकता है।

के साथ शुरू करें --allowJs

यदि --allowJsआप सभ्य परिणाम दे दी है और आप एक बेहतर परिभाषा फ़ाइल अपने आप को, आप को जोड़ सकते हैं लिखना चाहते हैं --allowJsके साथ --declarationपुस्तकालय के प्रकार पर टाइपप्रति में "बेस्ट अनुमान" को देखने के लिए। यह आपको एक अच्छा शुरुआती बिंदु देगा, और हाथ से लिखी गई फ़ाइल के रूप में अच्छा हो सकता है अगर JSDoc टिप्पणियां अच्छी तरह से लिखी गई हैं और संकलक उन्हें खोजने में सक्षम था।

प्रारंभ करें dts-gen के साथ

यदि --allowJsकाम नहीं किया, तो आप प्रारंभिक बिंदु प्राप्त करने के लिए dts-gen ( https://github.com/Microsoft/dts-gen ) का उपयोग करना चाह सकते हैं । यह उपकरण सभी उपलब्ध संपत्तियों की सही गणना करने के लिए ऑब्जेक्ट के रनटाइम आकार का उपयोग करता है। प्लस साइड पर यह बहुत सटीक होता है, लेकिन टूल अभी तक अतिरिक्त प्रकार को पॉप्युलेट करने के लिए JSDoc टिप्पणियों को स्क्रैप करने का समर्थन नहीं करता है। आप इसे इस तरह चलाते हैं:

npm install -g dts-gen
dts-gen -m <your-module>

यह your-module.d.tsवर्तमान फ़ोल्डर में उत्पन्न होगा ।

स्नूज़ बटन मारो

यदि आप इसे बाद में करना चाहते हैं और कुछ समय के लिए टाइप टाइपस्क्रिप्ट 2.0 में रहते हैं, तो अब आप लिख सकते हैं

declare module "foo";

जो आप करने देगा प्रकार के साथ मॉड्यूल । यदि आपके पास एक वैश्विक है जिसे आप बाद में निपटना चाहते हैं, तो बस लिखेंimport"foo"any

declare const foo: any;

जो आपको एक fooचर देगा।


25
आउच ... कि कई मामलों में प्रवेश के लिए एक महत्वपूर्ण बाधा होने जा रहा है। यह अच्छा होगा कि एक उपकरण हो जो प्रकार के अनुमान के आधार पर कम से कम "सर्वश्रेष्ठ अनुमान" का उत्पादन कर सके। जबकि ये इष्टतम नहीं हो सकते हैं, वे कम से कम समय के साथ ट्यून किए जा सकते हैं।
१३:१३ पर हॉट्रोडोम्नेकी

7
+1 - आगे की खुशखबरी: फ़ाइल और फ़ाइल --declarationsदोनों को जनरेट करती है , जिसका मतलब है कि आपको केवल एक ही संकलन चलाने की आवश्यकता है। .js.d.ts
फेंटन

67
लोकप्रिय पुस्तकालयों के लिए उच्च-गुणवत्ता की परिभाषाओं का एक संग्रह github.com/borisyankov/DefinitelyTyped
बोरिस यांकोव

10
टाइपस्क्रिप्ट में पहले से मौजूद IntelliSense की तुलना में एक 'सर्वश्रेष्ठ अनुमान' टूल कोई बेहतर नहीं होगा। टाइप परिभाषाओं का लाभ संकलक को information अनुमान ’की तुलना में अधिक जानकारी प्रदान करने में है।
बोरिस यानकोव

12
--allowJs--declarationविकल्पों के साथ जोड़ा नहीं जा सकता (टाइपस्क्रिप्ट 1.8 और 2.0 में परीक्षण किया गया)। अगर मैं कोशिश करूँ, तो मुझे पता है:error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
एलेक्सी

52

आप या तो उपयोग कर सकते हैं tsc --declaration fileName.tsरयान की तरह का वर्णन करता है, या आप निर्दिष्ट कर सकते हैं declaration: trueके तहत compilerOptionsअपने में tsconfig.jsonयह सोचते हैं आप पहले से ही एक मिला है tsconfig.jsonअपनी परियोजना के तहत।


4
यदि आप एक कोणीय 2 मॉड्यूल विकसित कर रहे हैं, तो यह सबसे अच्छा उत्तर है।
डार्सी

अगर मैं कोशिश करता tsc --declaration test.tsहूं Cannot find name...कि मुझे उन प्रकारों के लिए त्रुटि मिले जो मैं के लिए एक घोषणा फ़ाइल बनाने की कोशिश कर रहा हूं :) तो मुझे उन्हें घोषित करने से पहले प्रकारों की आवश्यकता होगी?
कोकोडोको

2
@ कोकोडोको, क्या आप declaration: trueअपनी tsconfig.jsonफ़ाइल में जोड़ने का प्रयास कर सकते हैं ?
JayKan

धन्यवाद, मैं सिर्फ * .d.ts से * .ts उत्पन्न करना चाहता था।
vintproykt

16

इससे निपटने का सबसे अच्छा तरीका (यदि एक घोषणा फ़ाइल निश्चित रूप से उपलब्ध नहीं है ) पूरी लाइब्रेरी के बजाय आपके द्वारा उपयोग की जाने वाली चीज़ों के लिए घोषणाएँ लिखना है। यह काम को बहुत कम कर देता है - और इसके अलावा संकलक लापता तरीकों के बारे में शिकायत करके मदद करने के लिए है।


15

जैसा कि रेयान कहते हैं, tsc संकलक में एक स्विच होता है --declarationजो एक .d.tsफ़ाइल से एक .tsफ़ाइल उत्पन्न करता है । यह भी ध्यान दें कि (कीड़े को छोड़कर) टाइपस्क्रिप्ट को जावास्क्रिप्ट को संकलित करने में सक्षम होना चाहिए, ताकि आप मौजूदा जावास्क्रिप्ट कोड को tsc संकलक के पास कर सकें।


1
वर्तमान में लगता है कि * ts में .js फाइलें पास हो रही हैं "एरर रीडिंग फाइल" कोणीय-रिसोर्स.जेएस ": फाइल पाया गया" एक त्रुटि उत्पन्न करता है। इसलिए आपको स्पष्ट रूप से * .js फ़ाइलों को * .ts का उपयोग करने में सक्षम होना चाहिए। tsc का उपयोग करने में सक्षम होना चाहिए। अधिक विवरण के लिए इस मुद्दे को देखें - मैंने इसे angularjs पर उपयोग करने की कोशिश की: टाइपस्क्रिप्ट.कोडप्लेक्स.
जेम्स स्ट्रेचन

3
मैं जो बता सकता हूं, tsc किसी भी मान्य जावास्क्रिप्ट को संकलित कर सकता है, लेकिन यदि यह मान्य टाइपस्क्रिप्ट (संकलन देता है) चेतावनी नहीं है, तो --declarations ध्वज एक .d.ts फ़ाइल का उत्पादन नहीं करता है, इसलिए जब तक कि आपका पुस्तकालय टाइपकर्ता में नहीं लिखा जाता है। अभी भी घोषणाओं को मैन्युअल रूप से बनाने की आवश्यकता है।
अग्रदल


3

यहाँ कुछ PowerShell है जो एक एकल टाइपस्क्रिप्ट परिभाषा फ़ाइल बनाता है जिसमें एक पुस्तकालय है जिसमें *.jsआधुनिक जावास्क्रिप्ट के साथ कई फाइलें शामिल हैं ।

सबसे पहले, सभी एक्सटेंशन को इसमें बदलें .ts

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

दूसरा, परिभाषा फ़ाइलों को उत्पन्न करने के लिए टाइपस्क्रिप्ट कंपाइलर का उपयोग करें। संकलक त्रुटियों का एक गुच्छा होगा, लेकिन हम उन पर ध्यान नहीं दे सकते।

Get-ChildItem | foreach { tsc $_.Name  }

अंत में, सभी *.d.tsफाइलों को एक index.d.tsमें मिलाएं, importबयानों को हटा दें और defaultप्रत्येक निर्यात विवरण को हटा दें।

Remove-Item index.d.ts; 

Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
  foreach { Get-Content $_ } | `
  where { !$_.ToString().StartsWith("import") } | `
  foreach { $_.Replace("export default", "export") } | `
  foreach { Add-Content index.d.ts $_ }

यह एक एकल, प्रयोग करने योग्य index.d.tsफ़ाइल के साथ समाप्त होता है जिसमें कई परिभाषाएं शामिल हैं।


2
दूसरा कदम, Get-ChildItem | foreach { tsc --declaration $ _। Name} ने काम किया (जोड़ा गया --declaration param)
गुरु_07

3

अपनी खुद की लाइब्रेरी बनाते समय, आप (टाइपस्क्रिप्ट कंपाइलर) कमांड *.d.tsका उपयोग करके फाइल बना सकते हैं tscजैसे: (यह मानते हुए कि आप अपनी लाइब्रेरी को dist/libफ़ोल्डर में बना रहे हैं)

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration): *.d.tsफ़ाइलें उत्पन्न करता है
  • --declarationDir dist/lib: उत्पन्न घोषणा फ़ाइलों के लिए आउटपुट निर्देशिका।
  • --declarationMap: प्रत्येक संबंधित '.d.ts' फ़ाइल के लिए एक सोर्समैप बनाता है।
  • --emitDeclarationOnly: केवल '.d.ts' घोषणा फ़ाइलों का उत्सर्जन करें। (कोई संकलित JS)

( सभी कमांड लाइन संकलक विकल्पों के लिए डॉक्स देखें )

या उदाहरण के लिए अपने में package.json:

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

और फिर चलाएं: yarn build:types(या npm run build:types)


मैं अभी भी यह पता नहीं लगा d.tsसकता कि फ़ाइलों को कैसे उत्पन्न किया जाए और इंटरफेस का उपयोग करने में सक्षम हो। क्या आपके पास कोई उदाहरण है?
दानोसेर

ऊपर एनपीएम स्क्रिप्ट *.d.tsफाइलों को उत्पन्न करेगी और उन्हें dist/libफ़ोल्डर में डाल देगी । आपको tsconfig.jsonअपने प्रोजेक्ट के रूट में एक फ़ाइल की आवश्यकता है , लेकिन यह प्रोजेक्ट के लिए वैसे भी काम करने के लिए होना चाहिए।
मैजिकमेकर

एक बार उजागर होने के बाद मैं उनका उपयोग करने में असमर्थ हूं। अगर आप इसे काम कर सकते हैं तो मेरे पास निम्नलिखित पोस्ट stackoverflow.com/questions/59742688 है ?
डैनोस्योर

2

मैं आपकी 3rd पार्टी JS लाइब्रेरीज़ की मौजूदा मैपिंग की तलाश करूँगा जो Script # या SharpKit का समर्थन करती है। इन C # से .js क्रॉस कंपाइलर्स के उपयोगकर्ताओं को अब आपके सामने आने वाली समस्या का सामना करना पड़ा होगा और हो सकता है कि आपके तीसरे पक्ष के काम को स्कैन करने और कंकाल C # कक्षाओं में परिवर्तित करने के लिए एक खुला स्रोत कार्यक्रम प्रकाशित किया हो। यदि ऐसा है तो C # की जगह टाइपस्क्रिप्ट बनाने के लिए स्कैनर प्रोग्राम को हैक करें।

टाइप करने के लिए, टाइपस्क्रिप्ट परिभाषाओं में आपकी 3 पार्टी के लिए सी # सार्वजनिक इंटरफ़ेस का अनुवाद करना स्रोत जावास्क्रिप्ट को पढ़ने से ऐसा करने की तुलना में सरल हो सकता है।

मेरी विशेष रुचि स्नेचा के एक्सटीजेएस आरआईए फ्रेमवर्क है और मुझे पता है कि स्क्रिप्ट # या शार्पकिट के लिए सी # व्याख्या उत्पन्न करने के लिए प्रकाशित परियोजनाएं हैं।


FYI करें: मैंने अभी-अभी Sencha / ExtJS के लिए अपनी पहली टाइपस्क्रिप्ट परिभाषा फ़ाइल बनाई: github.com/andremussche/extjsTypescript/blob/master/jsondocs/…
André

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