reflect-metadata TypeScript: पूर्ण गाइड उदाहरण सहित
TypeScript के लिए reflect-metadata लाइब्रेरी की इस विस्तृत गाइड में आपका स्वागत है। यह लाइब्रेरी Angular, NestJS और TypeORM जैसे आधुनिक फ्रेमवर्क की नींव है। यह क्लास, मेथड, प्रॉपर्टी और पैरामीटर के लिए रनटाइम पर मेटाडेटा (डेटा के बारे में डेटा) जोड़ने और पढ़ने की सुविधा देती है। अगर आप समझना चाहते हैं कि TypeScript में डेकोरेटर और Dependency Injection (DI) कैसे काम करते हैं, तो reflect-metadata सीखना ज़रूरी है।
1. यह क्या है और इसकी ज़रूरत क्यों है?
reflect-metadata बिल्ट-इन Reflect ऑब्जेक्ट का एक पॉलीफिल (कार्यान्वयन) है, जो ES2016 (ES7) स्पेसिफिकेशन का हिस्सा है। इस लाइब्रेरी का मुख्य उद्देश्य मेटाडेटा के साथ काम करने के लिए API प्रदान करना है, जिसे कोड के विभिन्न तत्वों (क्लास, मेथड, प्रॉपर्टी) से जोड़ा जा सकता है। मानक JavaScript में यह सुविधा नहीं है, इसलिए TypeScript के लिए एक अलग पैकेज इंस्टॉल करना पड़ता है।
इसकी ज़रूरत क्यों है? मान लीजिए आप एक फ्रेमवर्क लिख रहे हैं। आपको जानना होगा कि किसी क्लास के लिए कौन सी डिपेंडेंसी चाहिए, कंट्रोलर मेथड से कौन से रूट जुड़े हैं, या किसी एंटिटी के कौन से फील्ड JSON में सीरियलाइज़ होने चाहिए। मेटाडेटा के बिना, आपको यह जानकारी अलग कॉन्फ़िगरेशन फ़ाइलों में स्टोर करनी होगी या जटिल पैटर्न का उपयोग करना होगा। reflect-metadata आपको इस जानकारी को सीधे कोड में स्टोर करने की अनुमति देता है, जिससे कोड अधिक स्व-दस्तावेजीकरण और विश्लेषण में आसान हो जाता है।
यह लाइब्रेरी डेकोरेटर से गहराई से जुड़ी है। डेकोरेटर एक फंक्शन है जो क्लास, मेथड या प्रॉपर्टी पर लागू होता है। डेकोरेटर के अंदर, आप Reflect.defineMetadata को कॉल करके कुछ जानकारी सेव कर सकते हैं, और फिर प्रोग्राम के किसी दूसरे हिस्से में Reflect.getMetadata का उपयोग करके उसे प्राप्त कर सकते हैं। यह Dependency Injection, ORM (Object-Relational Mapping), वैलिडेशन और कई अन्य पैटर्न को लागू करने का आधार है।
2. इंस्टॉलेशन
लाइब्रेरी को npm (Node Package Manager) के माध्यम से इंस्टॉल किया जाता है। सुनिश्चित करें कि आपके पास Node.js (वर्शन 12 या उससे ऊपर) इंस्टॉल है।
npm install reflect-metadata --save
इंस्टॉल करने के बाद, लाइब्रेरी को अपनी एंट्री फ़ाइल (आमतौर पर main.ts या index.ts) की शुरुआत में इम्पोर्ट करना ज़रूरी है, ताकि यह ग्लोबली उपलब्ध हो जाए।
import "reflect-metadata";
महत्वपूर्ण: यह इम्पोर्ट Reflect का उपयोग करने वाले किसी भी अन्य कोड से पहले होना चाहिए। अगर आप कोई फ्रेमवर्क (जैसे Angular) उपयोग कर रहे हैं, तो वह यह अपने आप कर देगा। अन्यथा, इस लाइन को फ़ाइल की शुरुआत में जोड़ें।
साथ ही, tsconfig.json फ़ाइल में डेकोरेटर और मेटाडेटा का समर्थन सक्षम करना होगा:
{
"compilerOptions": {
"target": "ES6",
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
emitDecoratorMetadata फ़्लैग TypeScript कंपाइलर को डेकोरेटेड एलिमेंट्स के लिए टाइप मेटाडेटा जनरेट करने के लिए मजबूर करता है। कई फ्रेमवर्क के काम करने के लिए यह ज़रूरी है।
3. त्वरित शुरुआत — एक न्यूनतम कार्यशील उदाहरण
आइए एक सरल उदाहरण बनाते हैं जो दिखाता है कि क्लास में मेटाडेटा कैसे जोड़ें और उसे कैसे पढ़ें।
import "reflect-metadata";
// 1. मेटाडेटा के लिए एक की परिभाषित करें
const METADATA_KEY = "my_custom_key";
// 2. एक डेकोरेटर बनाएं जो मेटाडेटा जोड़ता है
function MyDecorator(value: string) {
return function (target: any) {
// target — यह क्लास का कंस्ट्रक्टर है
Reflect.defineMetadata(METADATA_KEY, value, target);
};
}
// 3. डेकोरेटर को क्लास पर लागू करें
@MyDecorator("यह मेरी क्लास है")
class MyClass {
greet() {
console.l