मैंने देखा कि कई परिवेश घोषणा फ़ाइलें declare a namespace और a module जो केवल नाम स्थान का निर्यात करती हैं, आमतौर पर कुछ जिम्नास्टिक का उपयोग करती हैं जिन्हें मैं वास्तव में नहीं समझता हूं। उदाहरण के लिए, react.d.ts में आप देख सकते हैं यह:

declare namespace __React {

    ... entire API of the react library ...

}

declare module "react" {
    export = __React;
}
  1. namespace और module दोनों ही क्यों? इसके अंदर पुस्तकालय एपीआई के साथ मॉड्यूल की घोषणा क्यों न करें?
  2. नेमस्पेस को __React क्यों कहा जाता है न कि केवल React? ऐसा लगता है कि एक अजीब "मेरा उपयोग न करें" नाम, फिर भी IntelliJ IDEA ने इसे मेरे पूरे स्रोत कोड में आयात किया है और ऐसा लगता है कि यह काम करता है।
5
Aaron Beall 24 फरवरी 2016, 02:17

1 उत्तर

सबसे बढ़िया उत्तर

इस पैटर्न का उपयोग UMD लाइब्रेरी को सपोर्ट करने के लिए किया जाता है।

ये पुस्तकालय आम तौर पर वैश्विक दायरे में कुछ डालते हैं यदि वे <script ...> टैग के माध्यम से लोड होते हैं, लेकिन मॉड्यूल लोडर को कुछ वापस कर देते हैं यदि मॉड्यूल सिस्टम जैसे RequJS, CommonJS, या SystemJS के माध्यम से लागू किया जाता है।

टाइपस्क्रिप्ट में, इसका मतलब है कि यदि आप import मॉड्यूल को 'react' कहते हैं, तो आपको उसी प्रकार का मिलना चाहिए जैसे कि आप वैश्विक पहचानकर्ता React को संदर्भित करते हैं।

अधिकांश परिभाषा फ़ाइलें बस अपनी .d.ts फ़ाइलें लिखती हैं जैसे कि मॉड्यूल आकार और वैश्विक चर दोनों हमेशा मौजूद रहते हैं; प्रतिक्रिया लेखकों को यह पसंद नहीं आया कि आप गलती से वैश्विक प्रतिक्रिया का उल्लेख कर सकते हैं यदि आप एक मॉड्यूल लोडर का उपयोग कर रहे थे (जिस स्थिति में वैश्विक वास्तव में वहां नहीं होगा) इसलिए उन्होंने घोषणा को अलग कर दिया __React, एक अलग .d.ts फ़ाइल जिसे React नाम से ग्लोबल घोषित किया गया है, और "react" के लिए एक मॉड्यूल डिक्लेरेशन है।

8
Koert van Kleef 12 जुलाई 2016, 11:22
धन्यवाद, यह वास्तव में स्पष्ट स्पष्टीकरण था और अब यह सब समझ में आता है! दिलचस्प (कष्टप्रद) यह है कि IntelliJ IDEA हमेशा import {Component} from "react" के बजाय import Component = __React.Component चाहता है, भले ही मैं module: commonjs का उपयोग कर रहा हूं। इंटरफेस के लिए, जैसे import MouseEventHandler = _React.MouseEventHandler यह काम करता है, मुझे लगता है क्योंकि इंटरफ़ेस संकलित जेएस में एक संदर्भित प्रतीक नहीं है, लेकिन अन्य चीजों के लिए मुझे Can't find variable: __React मिलता है। मुझे लगता है कि आईडीई यहां थोड़ा बेहतर हो सकता है।
 – 
Aaron Beall
24 फरवरी 2016, 04:25