आपका TypeScript 'experimental decorators' के बारे में क्यों चिल्ला रहा है?
\n\nक्या आपने कभी TypeScript प्रोजेक्ट को कंपाइल करते समय कंसोल में कुछ इस तरह देखा है:
\n\nExperimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option in your 'tsconfig.json' or '--experimentalDecorators' to remove this warning.\n\nअगर हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर इस सवाल के हज़ारों व्यूज़ और दर्जनों जवाब हैं। लेकिन उनमें से ज़्यादातर बस 'फ़्लैग ऑन करो और भूल जाओ' सुझाते हैं। आज हम इससे आगे जाएंगे: समझेंगे कि TypeScript में experimental decorators warning क्या है, यह कहाँ से आता है, अंदर से कैसे काम करता है, और TypeScript डेकोरेटर्स को 'experimental' क्यों मानता है।
\n\nTypeScript में डेकोरेटर्स क्या हैं (और वे experimental क्यों हैं)?
\n\nडेकोरेटर्स मेटाप्रोग्रामिंग का एक शक्तिशाली टूल हैं। वे रनटाइम के दौरान क्लासेस, मेथड्स, प्रॉपर्टीज़ और पैरामीटर्स को एनोटेट और मॉडिफाई करने देते हैं। अगर आपने Angular, NestJS या TypeORM के साथ काम किया है, तो आप इनसे पहले ही मिल चुके हैं:
\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html'\n})\nclass AppComponent {}\n\nलेकिन यहाँ एक पेंच है: JavaScript में डेकोरेटर्स का स्टैंडर्ड (TC39 proposal) अभी भी Stage 3 पर है। इसका मतलब है कि सिंटैक्स और सिमैंटिक्स बदल सकते हैं। TypeScript, JavaScript का एक सुपरसेट होने के नाते, इस इम्प्लीमेंटेशन को 'फ्रीज़' नहीं कर सकता — यह experimentalDecorators फ़्लैग के ज़रिए डेकोरेटर्स के लिए एक्सपेरिमेंटल सपोर्ट प्रदान करता है।
जब आप इस ऑप्शन को चालू करते हैं, TypeScript कंपाइलर ऐसा कोड जनरेट करता है जो स्टैंडर्ड अपडेट होने पर पुराना या टूट सकता है। इसीलिए वह ईमानदारी से चेतावनी देता है: 'आप अपने जोखिम पर उपयोग कर रहे हैं'।
\n\nकंपाइलर के अंदर experimental decorators warning कैसे काम करता है?
\n\nइस चेतावनी को समझने के लिए, TypeScript के सोर्स कोड में झाँकते हैं। checker.ts फ़ाइल (हाँ, यह कंपाइलर के अंदर की असली फ़ाइल है) में एक फंक्शन है checkGrammarForDecorator। जब पार्सर एक डेकोरेटर से मिलता है, कंपाइलर जाँचता है कि tsconfig.json में experimentalDecorators फ़्लैग सेट है या नहीं।
अगर फ़्लैग सेट नहीं है, तो यह एक डायग्नोस्टिक मैसेज जनरेट करता है — वही चेतावनी। यह कोई एरर नहीं है (कोड फिर भी कंपाइल होगा), लेकिन कंपाइलर ज़ोर देकर याद दिलाता है: 'अरे, तुम एक ऐसी फीचर का उपयोग कर रहे हो जो बदल सकती है!'।
\n\nयहाँ सरलीकृत लॉजिक दिया गया है:
\n\n// TypeScript की असली लॉजिक का स्यूडोकोड\nfunction checkDecoratorUsage(decorator: Decorator, options: CompilerOptions) {\n if (!options.experimentalDecorators) {\n reportDiagnostic({\n code: 1219,\n message: "Experimental support for decorators is a feature that is subject to change in a future release..."\n });\n }\n}\n\nएरर कोड 1219 वही चेतावनी है जो आप देखते हैं। और कोड 1220 emitDecoratorMetadata के लिए समान चेतावनी है (एक और एक्सपेरिमेंटल फ़्लैग, जिसके बारे में हम नीचे बात करेंगे)।
experimental decorators warning को कैसे बंद करें: 3 तरीके
\n\nसबसे आसान तरीका है tsconfig.json में फ़्लैग जोड़ना:
{\n "compilerOptions": {\n "experimentalDecorators": true\n }\n}\n\nअगर आप कमांड लाइन का उपयोग कर रहे हैं:
\n\ntsc --experimentalDecorators\n\nया अगर आपके पास tsconfig.json नहीं है, तो सीधे फ़्लैग पास कर सकते हैं:
npx tsc --experimentalDecorators src/index.ts\n\nइसके बाद चेतावनी गायब हो जाएगी। लेकिन यह सिर्फ हिमशैल का सिरा है। आइए समझते हैं कि जब आप experimentalDecorators चालू करते हैं तो वास्तव में क्या होता है।
कंपाइलर अंदर से क्या जनरेट करता है?
\n\nजब आप क्लास डेकोरेटर लिखते हैं, तो कंपाइलर