प्रतिनिधि इंटरव्यू विषय

कोडिंग इंटरव्यू: आप TypeScript 7 नेटिव कंपाइलर पर सुरक्षित रूप से कैसे माइग्रेट करेंगे?

कोडिंगकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक TypeScript 6 मोनोरेपो में CI टाइप-चेकिंग धीमी है और ऐसे टूल्स हैं जो TypeScript API पर निर्भर करते हैं। आप TypeScript 7 पर सुरक्षित रूप से कैसे माइग्रेट करेंगे?

प्रॉम्प्ट और संदर्भ

आपकी टीम एक TypeScript 6 मोनोरेपो में वेब एप्लिकेशन और शेयर्ड पैकेज मेंटेन करती है। CI टाइप-चेकिंग बहुत धीमी है, और रिपॉजिटरी typescript-eslint, एक webpack लोडर, तथा Vue और Angular टेम्पलेट टूलिंग का उपयोग करती है। आपको TypeScript 7 नेटिव कंपाइलर का मूल्यांकन करना होगा।

एक ऐसा माइग्रेशन प्लान डिज़ाइन करें जो TypeScript 6 कम्पैटिबिलिटी लेयर को बनाए रखे, CLI और एडिटर अपग्रेड्स को शेड्यूल करे, पैरेलल चेकिंग के मेमोरी जोखिम को नियंत्रित करे, और कैनरी, मेट्रिक्स तथा रोलबैक गेट्स को परिभाषित करे।

इंटरव्यूअर क्या टेस्ट करता है

  • क्या आप tsc CLI, एडिटर लैंग्वेज सर्विसेज और प्रोग्रामेटिक TypeScript API डिपेंडेंसीज के बीच अंतर समझते हैं।
  • क्या पिंड वर्जन्स, दो कंपाइलर और तुलनीय आर्टिफैक्ट्स माइग्रेशन के जोखिम को कम कर सकते हैं।
  • क्या पैरेलेलिज्म, मेमोरी, डायग्नोस्टिक अंतर और इकोसिस्टम कम्पैटिबिलिटी निष्पादन योग्य रिलीज गेट्स बनते हैं।
  • क्या आप उस सीमा को स्पष्ट कर सकते हैं जो TypeScript 7 में अभी तक एक स्थिर प्रोग्रामेटिक API न होने के कारण बनती है।

स्पष्ट करने के लिए प्रश्न

  1. क्या CI tsc --build, एक आइसोलेटेड प्रोजेक्ट या एक कस्टम कंपाइलर API का उपयोग करता है?
  2. कौन से टूल्स सीधे typescript को इम्पोर्ट करते हैं, और कौन से केवल डिक्लेरेशन या CLI आउटपुट पढ़ते हैं?
  3. क्या TypeScript 6 stableTypeOrdering सक्षम है, जिसमें डिक्लेरेशन, डायग्नोस्टिक्स और बिल्ड टाइम के लिए बेसलाइन मौजूद हैं?
  4. क्या एडिटर वर्जन्स, Node मेमोरी लिमिट, और CI रनर CPU/मेमोरी तय (fixed) हैं?

30-सेकंड का उत्तर

मैं हर TypeScript API उपभोक्ता की सूची बनाऊंगा, फिर पिंड वर्जन्स और एक लॉकफाइल के साथ TypeScript 6 कम्पैटिबिलिटी पैकेज के साथ TypeScript 7 CLI इंस्टॉल करूंगा। CI में मैं डिक्लेरेशन, डायग्नोस्टिक्स, जनरेटेड JavaScript, सोर्स मैप्स, टेस्ट्स और रिसोर्स उपयोग की तुलना करूंगा; मैं पहले TypeScript 6 की तरफ stableTypeOrdering को सक्षम करूंगा। मैं TypeScript 7 --checkers और --builders को केवल बेसलाइन के आधार पर बढ़ाऊंगा, और --singleThreaded को डायग्नोस्टिक स्विच के रूप में रखूंगा। स्थिर API पथ के बिना Vue, MDX, Astro, Svelte और Angular टूल्स TypeScript 6 पर ही रहेंगे। एडॉप्शन का दायरा बढ़ाने से पहले मैं कैनरीज़, चरणबद्ध एडिटर रोलआउट और स्पष्ट वर्जन वाले रोलबैक का उपयोग करूंगा।

चरण-दर-चरण गहन विश्लेषण

कंपाइलर और API डिपेंडेंसीज की सूची बनाएं

Node, पैकेज मैनेजर, TypeScript, tsconfig, प्रोजेक्ट रेफरेंस, लोडर्स, प्लगइन्स और एडिटर वर्जन्स को रिकॉर्ड करें। उपभोक्ताओं को CLI, डिक्लेरेशन/जनरेटेड आर्टिफैक्ट्स, लैंग्वेज सर्विस या प्रोग्रामेटिक API के रूप में वर्गीकृत करें; प्रोग्रामेटिक API उपयोगकर्ताओं को एक अलग कम्पैटिबिलिटी जांच की आवश्यकता होती है।

TypeScript 7 और TypeScript 6 को साथ-साथ इंस्टॉल करें

TypeScript 7 वर्तमान में नेटिव कंपाइलर प्रदान करता है लेकिन कोई स्थिर API नहीं। tsc को 7 का उपयोग करने दें जबकि एक npm उपनाम (alias) tsc6 को सुरक्षित रखता है:

json
{
  "devDependencies": {
    "@typescript/native": "npm:typescript@^7.0.2",
    "typescript": "npm:@typescript/typescript6@^6.0.2"
  }
}

सत्यापन पास करने वाले वर्जन्स को पिन करें और लॉकफाइल कमिट करें। स्क्रिप्ट्स को प्रत्येक बाइनरी को स्पष्ट रूप से कॉल करना चाहिए ताकि पैकेज-मैनेजर फ़्लैटनिंग चुपचाप गलत कंपाइलर का चयन न कर सके।

तुलनीय आर्टिफैक्ट बेसलाइन स्थापित करें

पहले TypeScript 6 stableTypeOrdering को सक्षम करें, फिर .d.ts, डायग्नोस्टिक्स, जनरेटेड JavaScript, सोर्स मैप्स, इंक्रीमेंटल कैश और टेस्ट परिणामों को सहेजें। ऑर्डरिंग परिवर्तनों, वास्तविक टाइप त्रुटियों और टूल फॉर्मेटिंग अंतरों को अलग करें; केवल व्याख्या योग्य और API-सुरक्षित परिवर्तन ही अनुमत सूची (allowlist) में शामिल होने चाहिए।

चेकर और बिल्डर पैरेलेलिज्म को ट्यून करें

TypeScript 7 डिफ़ॉल्ट रूप से चार चेकर वर्कर्स का उपयोग करता है, और बिल्डर्स भी समानांतर में चल सकते हैं। पैरेलेलिज्म बढ़ाने से पहले निश्चित CPU, मेमोरी और प्रोजेक्ट क्रम पर मापें। वॉल-क्लॉक समय, पीक RSS, GC और पुनः प्रयासों को रिकॉर्ड करें; रनर मेमोरी बजट से अधिक होने पर रोलबैक करें। नॉन-डिटर्मिनिज्म को पुनरुत्पादित करने के लिए --singleThreaded का उपयोग करें और CI में एक निश्चित वर्कर काउंट बनाए रखें।

इकोसिस्टम टूल्स और एडिटर रोलआउट को अलग करें

एक स्थिर प्रोग्रामेटिक API मौजूद होने से पहले टेम्पलेट टूल्स को अपग्रेड करने के लिए मजबूर न करें। Vue, MDX, Astro, Svelte और Angular टूल्स अभी भी TypeScript 6 API पर निर्भर हो सकते हैं, इसलिए उन्हें tsc6 का उपयोग करने दें या एक अलग TS6 लैंग्वेज सर्विस बनाए रखें। पहले एक छोटे डेवलपर चैनल के लिए मैचिंग एडिटर एक्सटेंशन सक्षम करें और कंप्लीशन, नेविगेशन, डायग्नोस्टिक्स तथा क्रैश दरों का निरीक्षण करें।

कैनरी, मेट्रिक्स और रोलबैक

कम जोखिम वाले पैकेज और एक CI कैनरी के साथ शुरुआत करें। बिल्ड समय, डायग्नोस्टिक अंतर, डिक्लेरेशन कम्पैटिबिलिटी, पीक मेमोरी, एडिटर त्रुटियों और टेस्ट पास दर की तुलना करें। विफलता पर, पुरानी लॉकफाइल, स्क्रिप्ट्स और TS6 एडिटर चैनल को पुनर्स्थापित करें; केवल TS7 पैकेज को हटाने से मिसमैच्ड लोडर रह सकता है। सभी गेट्स के बार-बार पास होने के बाद ही अन्य वर्कस्पेस में विस्तार करें।

मॉडल उत्तर

TypeScript 7 का मूल्य एक नेटिव कंपाइलर और तेज़ CLI है, लेकिन API उपभोक्ता माइग्रेशन की सीमा तय करते हैं। मैं दो-ट्रैक योजना चलाऊंगा: CLI कार्य के लिए TS7 और कम्पैटिबिलिटी के लिए TS6। दोनों वर्जन्स को पिन करें, tsc और tsc6 को एक्सपोज़ करें, और लोडर्स, टेम्पलेट टूल्स और एडिटर्स को उनकी प्रोग्रामेटिक API डिपेंडेंसी के अनुसार रूट करें। पहले stableTypeOrdering को सक्षम करें और डिक्लेरेशन, डायग्नोस्टिक्स, जनरेटेड आर्टिफैक्ट्स, सोर्स मैप्स, टेस्ट्स और रिसोर्स उपयोग की तुलना करें। एक निश्चित रनर के सामने समानांतर सेटिंग्स को ट्यून करें, पुनरुत्पादन के लिए --singleThreaded का उपयोग करें। कैनरीज़ और चरणबद्ध एडिटर एडॉप्शन के माध्यम से विस्तार करें; कोई भी डायग्नोस्टिक रिग्रेशन, डिक्लेरेशन ब्रेक, मेमोरी ओवररन या एडिटर विफलता रोलबैक को ट्रिगर करती है। चूंकि TypeScript 7 में अभी तक कोई स्थिर प्रोग्रामेटिक API नहीं है, इसलिए जब तक इकोसिस्टम टूल्स अपना सत्यापन पूरा नहीं कर लेते, तब तक TS6 को बनाए रखें।

सामान्य गलतियां

  • typescript वर्जन को उसके API को इम्पोर्ट करने वाले लोडर्स, प्लगइन्स और टेम्पलेट टूल्स की जांच किए बिना बदलना।
  • रिपॉजिटरी बेसलाइन या मेमोरी बजट के बिना हर स्पीडअप का श्रेय नेटिव कंपाइलर को देना।
  • stableTypeOrdering को सक्षम किए बिना डिक्लेरेशन ऑर्डरिंग परिवर्तनों को टाइप रिग्रेशन के रूप में मानना।
  • रनर मेमोरी और पुनः प्रयास व्यवहार की अनदेखी करते हुए CI पैरेलेलिज्म को अधिकतम करना।
  • सिर्फ इसलिए एडिटर और प्रोग्रामेटिक API कम्पैटिबिलिटी मान लेना क्योंकि CLI काम कर रहा है।
  • लॉकफाइल, स्क्रिप्ट्स और एडिटर वर्जन्स को सुरक्षित रखे बिना केवल मौखिक "TS7 अनइंस्टॉल करें" रोलबैक की योजना बनाना।

फॉलो-अप प्रश्न

यदि कोई लोडर TypeScript 6 API पर निर्भर करता है, तो क्या केवल CI अपग्रेड हो सकता है?

हाँ। पहले केवल टाइप-चेक कैनरी को अपग्रेड करें, लोडर को tsc6 या TypeScript 6 API पर रखें, और लोडर को अपग्रेड करने से पहले जनरेटेड आर्टिफैक्ट्स और डिक्लेरेशन को सत्यापित करें।

क्या एक बड़ा --checkers मान हमेशा बेहतर होता है?

नहीं। CPU, मेमोरी, प्रोजेक्ट ग्राफ और GC सभी मायने रखते हैं। एक निश्चित रनर पर वॉल-क्लॉक समय और पीक RSS के आधार पर चयन करें, और फ़ॉलबैक के रूप में एक छोटा मान रखें।

TypeScript 6 को कब हटाया जा सकता है?

प्रत्येक प्रोग्रामेटिक API उपभोक्ता, टेम्पलेट टूल, एडिटर और बिल्ड प्लगइन द्वारा कम्पैटिबिलिटी सत्यापन पास करने और कैनरी मेट्रिक्स के गेट्स के भीतर रहने के बाद। जब TypeScript 7 में एक स्थिर API आ जाए, तो कम्पैटिबिलिटी लेयर का पुनर्मूल्यांकन करें।

आप कैसे साबित करेंगे कि टाइप परिणाम नहीं बदले हैं?

डायग्नोस्टिक्स, डिक्लेरेशन, जनरेटेड JavaScript, सोर्स मैप्स और टेस्ट्स की तुलना करें, ऑर्डरिंग और फॉर्मेटिंग अंतरों को वर्गीकृत करें। केवल एग्जिट-कोड की समानता पर्याप्त नहीं है।

सार्वजनिक स्रोत

संबंधित प्रश्न

संबंधित इंटरव्यू टूल

कोडिंग प्रॉम्प्ट के लिए स्क्रीनशॉट का उपयोग करें

समस्या को कैप्चर करें, फिर क्रम से प्रतिबंधों (constraints), समाधान, कोड, एज केस और जटिलता पर काम करें।

टूल देखें