TypeScript में Get और Set: बिना दर्द के एक्सेसर्स का जादू
\n\nक्या आपने कभी TypeScript में कोई क्लास लिखा है और सोचा है: "काश मैं प्रॉपर्टी को स्मार्ट बना पाता, ताकि पढ़ने पर यह कुछ गणना करे और लिखने पर डेटा को सत्यापित करे"? मिलिए — गेटर्स (get) और सेटर्स (set) से। ये सिर्फ सिंटैक्टिक शुगर नहीं हैं, बल्कि डेटा तक पहुंच को नियंत्रित करने के लिए एक शक्तिशाली उपकरण हैं।
\n\nयदि आप पहले से Stack Overflow पर इस विषय से परिचित हैं, तो आप जानते हैं: प्रश्न "get and set in TypeScript" हजारों बार देखा जाता है। लोग भ्रमित हो जाते हैं कि एक्सेसर्स का उपयोग कब करें और सामान्य विधियों का कब। इस लेख में हम सब कुछ स्पष्ट रूप से समझाएंगे: बुनियादी बातों से लेकर मुश्किल बारीकियों तक।
\n\nतैयार हैं? चलिए शुरू करते हैं!
\n\nTypeScript में get और set क्या हैं?
\n\nगेटर एक ऐसी विधि है जो प्रॉपर्टी को पढ़ने पर कॉल की जाती है। सेटर एक ऐसी विधि है जो मान निर्दिष्ट करने पर कॉल की जाती है। साथ में वे एक्सेसर्स (accessors) बनाते हैं। यह ऐसा दिखता है जैसे आप एक सामान्य फ़ील्ड के साथ काम कर रहे हैं, लेकिन अंदर से इसमें लॉजिक होता है।
\n\nयहाँ एक न्यूनतम उदाहरण है:
\n\nclass User {\n private _name: string = '';\n\n get name(): string {\n return this._name;\n }\n\n set name(value: string) {\n if (value.length > 0) {\n this._name = value;\n } else {\n console.log('नाम खाली नहीं हो सकता');\n }\n }\n}\n\nconst user = new User();\nuser.name = 'अन्ना'; // set कॉल होता है\nconsole.log(user.name); // get कॉल होता है → 'अन्ना'\nuser.name = ''; // खाली नाम सेट करने का प्रयास → कंसोल में संदेश\n\nध्यान दें: _ उपसर्ग वाली प्रॉपर्टी _name एक निजी फ़ील्ड है। बाहर से इस तक सीधी पहुंच संभव नहीं है। इसके बजाय हम सार्वजनिक एक्सेसर name का उपयोग करते हैं।
गेटर्स और सेटर्स की आवश्यकता क्यों है? 3 मुख्य कारण
\n\n1. डेटा सत्यापन
\nसेटर इनपुट मानों की जाँच करने के लिए एक आदर्श स्थान है। आप गलत डेटा को ऑब्जेक्ट में आने से पहले ही रोक सकते हैं।
\n\nclass Temperature {\n private _celsius: number = 0;\n\n get celsius(): number {\n return this._celsius;\n }\n\n set celsius(value: number) {\n if (value < -273.15) {\n throw new Error('परम शून्य से नीचे का तापमान संभव नहीं है');\n }\n this._celsius = value;\n }\n}\n\n2. गणना की गई प्रॉपर्टीज़
\nगेटर संग्रहीत मान नहीं, बल्कि अन्य डेटा के आधार पर गणना का परिणाम लौटा सकता है।
\n\nclass Rectangle {\n constructor(public width: number, public height: number) {}\n\n get area(): number {\n return this.width * this.height;\n }\n\n get perimeter(): number {\n return 2 * (this.width + this.height);\n }\n}\n\nconst rect = new Rectangle(10, 5);\nconsole.log(rect.area); // 50 — तुरंत गणना होती है\n\n3. एनकैप्सुलेशन और पहुंच नियंत्रण
\nआप किसी प्रॉपर्टी को केवल पढ़ने योग्य (केवल गेटर) या केवल लिखने योग्य (केवल सेटर) बना सकते हैं। इससे OOP सिद्धांतों का पालन करने में मदद मिलती है।
\n\nclass Config {\n private _apiKey: string = 'secret123';\n\n get apiKey(): string {\n // लॉगिंग या अधिकार जाँच जोड़ी जा सकती है\n return this._apiKey;\n }\n // सेटर परिभाषित नहीं है — प्रॉपर्टी केवल पढ़ने योग्य है\n}\n\nconst config = new Config();\nconsole.log(config.apiKey); // 'secret123'\n// config.apiKey = 'newKey'; // संकलन त्रुटि!\n\nTypeScript में get और set के बारे में सामान्य प्रश्न
\n\nआइए उन चीजों पर चर्चा करें जो शुरुआती (और न केवल) Stack Overflow और फ़ोरम पर सबसे अधिक पूछते हैं।
\n\nप्रश्न 1: get/set सामान्य विधियों से कैसे भिन्न हैं?
\nमुख्य अंतर कॉल का सिंटैक्स है। एक्सेसर्स प्रॉपर्टीज़ की तरह दिखते हैं: बिना कोष्ठक के। यह कोड को साफ और अधिक सहज बनाता है। तुलना करें:
\n\n// विधियों के साथ\nuser.getName();\nuser.setName('पीटर');\n\n// एक्सेसर्स के साथ\nuser.name;\nuser.name = 'पीटर';\n\nदूसरा अंतर यह है कि एक्सेसर्स को ओवरलोड नहीं किया जा सकता। प्रत्येक एक्सेसर का एक ही सिग्नेचर होता है