मैंने देखा कि कई परिवेश घोषणा फ़ाइलें declare
a namespace
और a module
जो केवल नाम स्थान का निर्यात करती हैं, आमतौर पर कुछ जिम्नास्टिक का उपयोग करती हैं जिन्हें मैं वास्तव में नहीं समझता हूं। उदाहरण के लिए, react.d.ts
में आप देख सकते हैं यह:
declare namespace __React {
... entire API of the react library ...
}
declare module "react" {
export = __React;
}
namespace
औरmodule
दोनों ही क्यों? इसके अंदर पुस्तकालय एपीआई के साथ मॉड्यूल की घोषणा क्यों न करें?- नेमस्पेस को
__React
क्यों कहा जाता है न कि केवलReact
? ऐसा लगता है कि एक अजीब "मेरा उपयोग न करें" नाम, फिर भी IntelliJ IDEA ने इसे मेरे पूरे स्रोत कोड में आयात किया है और ऐसा लगता है कि यह काम करता है।
1 उत्तर
इस पैटर्न का उपयोग UMD लाइब्रेरी को सपोर्ट करने के लिए किया जाता है।
ये पुस्तकालय आम तौर पर वैश्विक दायरे में कुछ डालते हैं यदि वे <script ...>
टैग के माध्यम से लोड होते हैं, लेकिन मॉड्यूल लोडर को कुछ वापस कर देते हैं यदि मॉड्यूल सिस्टम जैसे RequJS, CommonJS, या SystemJS के माध्यम से लागू किया जाता है।
टाइपस्क्रिप्ट में, इसका मतलब है कि यदि आप import
मॉड्यूल को 'react'
कहते हैं, तो आपको उसी प्रकार का मिलना चाहिए जैसे कि आप वैश्विक पहचानकर्ता React
को संदर्भित करते हैं।
अधिकांश परिभाषा फ़ाइलें बस अपनी .d.ts फ़ाइलें लिखती हैं जैसे कि मॉड्यूल आकार और वैश्विक चर दोनों हमेशा मौजूद रहते हैं; प्रतिक्रिया लेखकों को यह पसंद नहीं आया कि आप गलती से वैश्विक प्रतिक्रियाकोड> का उल्लेख कर सकते हैं यदि आप एक मॉड्यूल लोडर का उपयोग कर रहे थे (जिस स्थिति में वैश्विक वास्तव में वहां नहीं होगा) इसलिए उन्होंने घोषणा को अलग कर दिया
__React
, एक अलग .d.ts फ़ाइल जिसे React
नाम से ग्लोबल घोषित किया गया है, और "react"
के लिए एक मॉड्यूल डिक्लेरेशन है।
संबंधित सवाल
नए सवाल
module
एक बड़ा, अधिक जटिल प्रणाली का एक तार्किक उपखंड।
import {Component} from "react"
के बजायimport Component = __React.Component
चाहता है, भले ही मैंmodule: commonjs
का उपयोग कर रहा हूं। इंटरफेस के लिए, जैसेimport MouseEventHandler = _React.MouseEventHandler
यह काम करता है, मुझे लगता है क्योंकि इंटरफ़ेस संकलित जेएस में एक संदर्भित प्रतीक नहीं है, लेकिन अन्य चीजों के लिए मुझेCan't find variable: __React
मिलता है। मुझे लगता है कि आईडीई यहां थोड़ा बेहतर हो सकता है।