प्रॉम्प्ट और संदर्भ
एक Node.js सर्विस वर्तमान में कंटेनर शुरू होने से पहले TypeScript को JavaScript में संकलित (compile) करती है। टीम स्क्रिप्ट्स और डेवलपर टूलचेन को छोटा करने के लिए .ts फ़ाइलों को सीधे निष्पादित करना चाहती है। बिल्ट-इन type stripping, इसकी सपोर्ट सीमा, मॉड्यूल रिज़ॉल्यूशन, कॉन्फ़िगरेशन सीमाएं, परीक्षण और प्रोडक्शन रिलीज़ रणनीति की व्याख्या करें।
इंटरव्यूअर क्या मूल्यांकन करता है
- क्या आप जानते हैं कि Node.js टाइप चेकिंग या रनटाइम कोड जनरेशन के बिना टाइप एनोटेशन को हटा देता है।
- क्या आप enums, रनटाइम नेमस्पेस, पैरामीटर प्रॉपर्टीज और डेकोरेटर्स को नॉन-इरेज़ेबल सिंटैक्स के रूप में पहचानते हैं।
- क्या आप समझते हैं कि Node.js
tsconfig.jsonको अनदेखा करता है, इसलिए पाथ अलियास और टारगेट ट्रांसफॉर्म स्वचालित रूप से लागू नहीं होते हैं। - क्या आप डेवलपमेंट स्क्रिप्ट्स, संकलित आर्टिफैक्ट्स, डिपेंडेंसीज और प्रोडक्शन सर्विसेज को अलग-अलग रखते हैं।
पूछने के लिए स्पष्टीकरण प्रश्न
- क्या लक्ष्य एक डेवलपमेंट स्क्रिप्ट, CLI, टेस्ट या लंबे समय तक चलने वाली प्रोडक्शन सर्विस है?
- क्या कोड enums, डेकोरेटर्स, पैरामीटर प्रॉपर्टीज, नेमस्पेस या पाथ अलियास का उपयोग करता है?
- क्या मॉड्यूल मोड, Node वर्ज़न, TypeScript वर्ज़न और रिलीज़ इमेज को मानकीकृत किया जा सकता है?
- क्या टीम को पूर्ण टाइप चेकिंग, सोर्स ट्रांसफ़ॉर्मेशन, सोर्स मैप्स या पुराने Node वर्ज़न के सपोर्ट की आवश्यकता है?
30-सेकंड उत्तर ढांचा
मैं बिल्ट-इन सुविधा को एक हल्के निष्पादक (lightweight executor) के रूप में मानूँगा। यह इरेज़ेबल टाइप सिंटैक्स को व्हाइटस्पेस से बदल देता है, कोई टाइप चेकिंग नहीं करता है, और enums या डेकोरेटर्स के लिए JavaScript जेनरेट नहीं करता है। सबसे पहले कोड को स्कैन करें और Node वर्ज़न को पिन करें। tsconfig पाथ अलियास पर निर्भर रहने के बजाय import type, स्पष्ट एक्सटेंशन और स्पष्ट मॉड्यूल नियमों का उपयोग करें। जिन सर्विसेज को पूर्ण TypeScript सेमेंटिक्स की आवश्यकता है, वे कंपाइलर या tsx को बनाए रखें; बिल्ट-इन पाथ की शुरुआत स्क्रिप्ट्स और छोटे टूल्स से होती है। कार्यक्षेत्र का विस्तार करने से पहले CI टाइप चेक, रनटाइम टेस्ट और आर्टिफ़ैक्ट चेक चलाता है।
चरण-दर-चरण गहन विश्लेषण
1. इरेज़र मॉडल (erasure model) की व्याख्या करें
Node.js टाइप एनोटेशन को व्हाइटस्पेस से बदल देता है, इसलिए स्टैक लाइन नंबर आम तौर पर सोर्स मैप्स के बिना भी संरेखित रहते हैं। यह टाइप-चेक नहीं करता है और न ही उस सिंटैक्स को रूपांतरित करता है जिसे JavaScript जनरेशन की आवश्यकता होती है। Enums, रनटाइम नेमस्पेस, पैरामीटर प्रॉपर्टीज और डेकोरेटर्स असमर्थित-सिंटैक्स त्रुटियां (unsupported-syntax errors) उत्पन्न करते हैं। सीधा निष्पादन केवल इरेज़ेबल सिंटैक्स तक ही सीमित है।
2. मॉड्यूल और इम्पोर्ट पिन करें
Node.js CommonJS और ES module TypeScript फ़ाइलों का समर्थन करता है; वास्तविक मोड पैकेज कॉन्फ़िगरेशन, एक्सटेंशन और इनवोकेशन पर निर्भर करता है। टाइप इम्पोर्ट्स को import type का उपयोग करना चाहिए; अन्यथा इरेज़ किए गए इम्पोर्ट को एक वैल्यू के रूप में माना जाता है और यह रनटाइम पर विफल हो जाता है। ऐसे अलियास के बजाय जिन्हें Node रूपांतरित नहीं कर सकता, रिज़ॉल्व होने योग्य रिलेटिव एक्सटेंशन और package.json imports का उपयोग करें।
3. tsconfig और डिपेंडेंसी सीमाओं का सम्मान करें
बिल्ट-इन निष्पादक tsconfig.json को अनदेखा करता है, इसलिए यह टारगेट लोअरिंग, पाथ मैपिंग या अन्य कंपाइलर ट्रांसफ़ॉर्म लागू नहीं करता है। Node.js असंकलित (uncompiled) सोर्स को पैकेज अनुबंध बनने से रोकने के लिए node_modules के तहत TypeScript फ़ाइलों को भी अस्वीकार करता है। जब ट्रांसफ़ॉर्मेशन, डेकोरेटर्स या TypeScript डिपेंडेंसीज की आवश्यकता हो, तो एक पूर्ण कंपाइलर या रनटाइम टूल का उपयोग करें।
4. सत्यापन और रोलबैक की योजना बनाएं
Node वर्ज़न मैट्रिक्स में लिंट, टाइप चेक, यूनिट टेस्ट, इंटीग्रेशन टेस्ट और स्टार्टअप प्रोब्स चलाएं। व्यवहार, स्टार्टअप समय और त्रुटियों के लिए संकलित और इरेज़ किए गए निष्पादन की तुलना करें। रनटाइम को पिन करें: type stripping v25.2 और v24.12 से स्थिर है, जबकि v26 प्रायोगिक ट्रांसफ़ॉर्म स्विच को हटा देता है। यदि प्रोडक्शन विफल हो जाता है, तो तदर्थ (ad hoc) असमर्थित ट्रांसफ़ॉर्म सक्षम करने के बजाय संकलित आर्टिफैक्ट्स पर वापस लौटें।
उच्च-गुणवत्ता वाला नमूना उत्तर
मैं बिल्ट-इन type stripping को एक हल्के TypeScript निष्पादन पथ के रूप में मानूँगा, न कि एक पूर्ण कंपाइलर के रूप में। Enums, डेकोरेटर्स, पैरामीटर प्रॉपर्टीज, रनटाइम नेमस्पेस, पाथ अलियास और TypeScript डिपेंडेंसीज की सूची बनाएं; इन्हें ट्रांसफ़ॉर्मेशन या चेकिंग की आवश्यकता होती है, इसलिए कंपाइलर या tsx को बनाए रखें। माइग्रेट किया गया कोड import type, स्थिर मॉड्यूल नियमों और रिज़ॉल्व होने योग्य रिलेटिव पाथ्स का उपयोग करता है, जबकि tsc --noEmit टाइप-चेक गेट बना रहता है। Node.js tsconfig को अनदेखा करता है, इसलिए बिल्ड स्क्रिप्ट्स को पैकेज इम्पोर्ट्स को स्पष्ट रूप से कॉन्फ़िगर करना चाहिए। सबसे पहले डेवलपमेंट स्क्रिप्ट्स और CLIs को कैनरी (canary) के रूप में रोल आउट करें, और CI से स्टार्टअप प्रोब्स, रनटाइम त्रुटियों, परीक्षणों और इमेज व्यवहार की तुलना करवाएं। यह क्षमता v25.2/v24.12 से स्थिर है और v26 प्रायोगिक ट्रांसफ़ॉर्म स्विच को हटा देता है। प्रोडक्शन सर्विसेज मैट्रिक्स पास होने के बाद ही स्विच होती हैं और संकलित-आर्टिफ़ैक्ट रोलबैक बनाए रखती हैं।
सामान्य गलतियाँ
- Type stripping को टाइप चेकिंग या एक पूर्ण कंपाइलर के रूप में मानना।
- Enums, डेकोरेटर्स, पैरामीटर प्रॉपर्टीज या रनटाइम नेमस्पेस वाली फ़ाइलों को सीधे चलाना।
- tsconfig paths, टारगेट ट्रांसफ़ॉर्म या JSX सेटिंग्स पर निर्भर रहना।
import typeको छोड़ देना और इरेज़र के बाद वैल्यू-इम्पोर्ट रनटाइम त्रुटि का कारण बनना।- प्रोडक्शन इमेज में
node_modulesसे असंकलित TypeScript चलाना। - टाइप चेक, इंटीग्रेशन टेस्ट या पुराने-वर्ज़न मैट्रिक्स के बिना स्टार्टअप स्पीड मापना।
फॉलो-अप प्रश्न और उत्तर
Type stripping को आमतौर पर सोर्स मैप की आवश्यकता क्यों नहीं होती है?
कार्यान्वयन एनोटेशन को व्हाइटस्पेस से बदल देता है और वर्ण स्थितियों को सुरक्षित रखता है, इसलिए रनटाइम लाइनें आम तौर पर सोर्स फ़ाइल से मैप रहती हैं। रूपांतरित सिंटैक्स को अभी भी एक पूर्ण कंपाइलर और सोर्स मैप्स की आवश्यकता होती है।
tsx या कंपाइलर को कब बनाए रखना चाहिए?
Enums, डेकोरेटर्स, पैरामीटर प्रॉपर्टीज, पाथ अलियास, टारगेट ट्रांसफ़ॉर्म, पूर्ण टाइप चेकिंग या TypeScript डिपेंडेंसीज जिन्हें संकलन की आवश्यकता होती है, उनके लिए टूलचेन को बनाए रखें।
आप Node वर्ज़न के अंतर को कैसे नियंत्रित करते हैं?
इमेज, CI और स्थानीय टूल्स में वर्ज़न को पिन करें और क्षमता का पता लगाएं (capability detection)। Type stripping को एक रनटाइम पूर्व-आवश्यकता मानें और इसके अनुपस्थित होने पर सत्यापित JavaScript आर्टिफ़ैक्ट पर वापस आएं।