TypeScript में Legacy कोड का रिफैक्टरिंग: A से Z तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Legacy कोड का रिफैक्टरिंग क्यों ज़रूरी है?

\n

आधुनिक वेब डेवलपमेंट में TypeScript बड़े प्रोजेक्ट्स के लिए एक मानक बन गया है। लेकिन कई कंपनियाँ और स्टार्टअप एक समस्या का सामना करते हैं: शुद्ध JavaScript या पुराने TypeScript में लिखा गया कोडबेस समय के साथ 'दलदल' में बदल जाता है। टाइप्स की कमी, बड़े-बड़े फंक्शन, छिपी हुई डिपेंडेंसी और पुराने पैटर्न — ये सब डेवलपमेंट को धीमा करते हैं और बग्स की संख्या बढ़ाते हैं।

\n

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

\n\n

1. विश्लेषण और इन्वेंटरी: शुरुआत कहाँ से करें?

\n

पहला और सबसे महत्वपूर्ण कदम है यह समझना कि हम किसके साथ काम कर रहे हैं। सब कुछ एक साथ फिर से लिखना संभव नहीं है। यह अराजकता और समय बर्बादी का रास्ता है। सही तरीका है कोडबेस का ऑडिट करना।

\n
    \n
  • 'हॉट स्पॉट' पहचानें। वे मॉड्यूल खोजें जो सबसे ज्यादा बदले जाते हैं या जिनमें सबसे ज्यादा बग्स हैं। git log या SonarQube जैसे टूल्स का उपयोग करें।
  • \n
  • अस्पष्ट टाइप्स खोजें। Legacy JS कोड में अक्सर ऐसे फंक्शन होते हैं जो any लेते हैं या @ts-ignore का उपयोग करते हैं। ऐसी जगहों की सूची बनाएँ।
  • \n
  • डिपेंडेंसी चेक करें। पुरानी लाइब्रेरीज़ (जैसे lodash 3.x) आधुनिक TypeScript API में बदलाव में बाधा डाल सकती हैं।
  • \n
  • टेस्ट लिखें। किसी भी रिफैक्टरिंग से पहले, कोड के मुख्य हिस्सों को टेस्ट से कवर करें। यह आपकी 'सुरक्षा जाल' है।
  • \n
\n

उदाहरण: आपके पास एक JS फंक्शन है जो यूज़र डेटा प्रोसेस करता है। इसे तुरंत फिर से लिखने के बजाय, पहले Jest या Vitest पर यूनिट टेस्ट जोड़ें:

\n
// legacy.js\nfunction processUser(data) {\n    return { name: data.name, age: data.age + 1 };\n}\n\n// test.js\nimport { processUser } from './legacy';\ntest('processUser increments age', () => {\n    expect(processUser({ name: 'Alice', age: 30 })).toEqual({ name: 'Alice', age: 31 });\n});\n
\n

इसके बाद ही रिफैक्टरिंग शुरू करें।

\n\n

2. सख्त टाइपिंग की ओर क्रमिक माइग्रेशन

\n

TypeScript कई स्तरों की सख्ती प्रदान करता है। Legacy कोड के लिए "strict": false से शुरू करना और धीरे-धीरे स्तर बढ़ाना बेहतर है। एक साथ सभी विकल्प चालू करने से सैकड़ों फाइलें टूट सकती हैं।

\n

मुख्य कदम:

\n
    \n
  • noImplicitAny चालू करें। यह आपको सभी पैरामीटर्स और रिटर्न वैल्यू के लिए टाइप स्पष्ट रूप से बताने पर मजबूर करेगा। पहले यह कठिन हो सकता है, लेकिन इसी से आपको सबसे खतरनाक जगहें मिलेंगी।
  • \n
  • strictNullChecks का उपयोग करें। बग्स का एक मुख्य कारण null और undefined है। यह फ्लैग आपको उन्हें स्पष्ट रूप से हैंडल करने पर मजबूर करेगा।
  • \n
  • noUnusedLocals और noUnusedParameters जोड़ें। ये डेड कोड हटाने में मदद करेंगे।
  • \n
\n

अस्पष्ट टाइप्स वाले फंक्शन के रिफैक्टरिंग का उदाहरण:

\n
// रिफैक्टरिंग से पहले (legacy JS)\nfunction calculateTotal(price, tax) {\n    return price + (price * tax);\n}\n\n// रिफैक्टरिंग के बाद (TypeScript)\ninterface PriceData {\n    price: number;\n    tax: number;\n}\n\nfunction calculateTotal({ price, tax }: PriceData): number {\n    if (price < 0 || tax < 0) {\n        throw new Error('Price and tax must be non-negative');\n    }\n    return price + (price * tax);\n}\n
\n

ध्यान दें: हमने सिर्फ टाइप नहीं जोड़े, बल्कि इंटरफ़ेस और वैलिडेशन का उपयोग करके API को और सुरक्षित बनाया।

\n\n

3. एंटीपैटर्न और पुराने कोड से छुटकारा

ब्लॉग

पुस्तक अनुशंसाएँ