परिचय: TypeScript आपके गुणों पर क्यों भड़कता है?
\n\nआप TypeScript में कोड लिख रहे हैं, सब कुछ बढ़िया चल रहा है... और अचानक — बैम! क्लास के गुण के नीचे लाल लहरदार रेखा, और कंपाइलर एक दिल दहला देने वाला वाक्य देता है: Property '...' has no initializer and is not definitely assigned in the constructor। परिचित लगता है? यदि आपने कभी Angular, React या बस TypeScript क्लासेस के साथ काम किया है — तो संभवतः हाँ।
यह त्रुटि Stack Overflow पर सबसे लोकप्रिय में से एक है (हज़ारों बार देखा गया, दर्जनों उत्तर)। लेकिन अच्छी खबर: यह डरावनी नहीं है। बुरी खबर: यदि आप इसे नहीं समझते हैं, तो आप रनटाइम में बग्स के साथ मुसीबत में पड़ सकते हैं। इस लेख में, हम समझेंगे कि यह TypeScript त्रुटि क्यों होती है, इसे कैसे ठीक करें और प्रत्येक समाधान कब उपयुक्त है।
\n\nत्रुटि "Property has no initializer" का क्या अर्थ है?
\n\nआइए इसे कंपाइलर की भाषा से मानवीय भाषा में अनुवाद करें। TypeScript आपसे कहता है: "अरे, तुमने क्लास में एक गुण घोषित किया, लेकिन उसे कोई प्रारंभिक मान नहीं दिया और न ही कंस्ट्रक्टर में असाइन किया। मुझे यकीन नहीं है कि जब तुम इस गुण को एक्सेस करोगे तो उसमें कुछ सार्थक होगा"।
\n\ntsconfig.json में strict: true चालू करें — और आप स्वचालित रूप से strictPropertyInitialization फ्लैग को सक्रिय कर देंगे। यही इस जाँच के लिए जिम्मेदार है। कोड कुछ इस तरह दिखता है:
class User {\n name: string; // ❌ त्रुटि!\n age: number; // ❌ त्रुटि!\n}\n\nTypeScript ठीक ही नोट करता है: यदि आप उन्हें आरंभ करना भूल जाते हैं तो name और age undefined हो सकते हैं। और उनका प्रकार undefined के बिना सख्त string और number है। तो यह रहा आपका विरोधाभास।
तरीका #1: घोषणा में ही आरंभीकरण
\n\nसबसे सरल और सुरक्षित तरीका — गुण को तुरंत मान देना। यह डिफ़ॉल्ट मान वाले फ़ील्ड के लिए विशेष रूप से सुविधाजनक है।
\n\nclass User {\n name: string = 'अतिथि';\n age: number = 0;\n createdAt: Date = new Date();\n}\n\nकब उपयोग करें: जब फ़ील्ड का कोई उचित डिफ़ॉल्ट मान हो। उदाहरण के लिए, काउंटर, फ़्लैग, निर्माण तिथि। यह TypeScript की सर्वोत्तम प्रथा है — आप स्पष्ट रूप से प्रारंभिक स्थिति निर्दिष्ट करते हैं।
\n\nतरीका #2: कंस्ट्रक्टर में आरंभीकरण
\n\nशैली की क्लासिक। यदि मान बाहर से आना चाहिए — तो कंस्ट्रक्टर में असाइन करें। TypeScript इसे स्वीकार करता है।
\n\nclass User {\n name: string;\n age: number;\n\n constructor(name: string, age: number) {\n this.name = name;\n this.age = age;\n }\n}\n\nमहत्वपूर्ण: कंपाइलर जाँच करेगा कि आपने सभी गुणों को मान असाइन किया है। यदि आप एक भूल जाते हैं — फिर से त्रुटि।
\n\nclass User {\n name: string;\n age: number;\n\n constructor(name: string) {\n this.name = name;\n // age असाइन नहीं किया गया — त्रुटि!\n }\n}\n\nयह जानबूझकर किया गया है: TypeScript आपको आकस्मिक undefined से बचाता है। आप या तो सभी फ़ील्ड को आरंभ करें, या स्पष्ट रूप से उन्हें अनिश्चित रहने दें।
तरीका #3: Definite assignment ऑपरेटर (!)
\n\nकभी-कभी आप निश्चित रूप से जानते हैं कि गुण बाद में आरंभ किया जाएगा, लेकिन कंस्ट्रक्टर में नहीं। उदाहरण के लिए, Angular में डिपेंडेंसी इंजेक्शन के माध्यम से या किसी एसिंक्रोनस विधि को कॉल करके। तब definite assignment assertion का उपयोग करें — गुण के नाम के बाद विस्मयादिबोधक चिह्न।
\n\nclass UserService {\n user!: User; // ठीक है, मैं वादा करता हूँ कि यह होगा\n\n constructor() {\n this.initUser();\n }\n\n initUser() {\n this.user = new User('एलिस', 30);\n }\n}\n\nसावधानी: यह एक शक्तिशाली लेकिन खतरनाक उपकरण है। आप TypeScript से कह रहे हैं: "जाँच मत करो, मुझे पता है मैं क्या कर रहा हूँ"। यदि आप गुण को आरंभ करना भूल जाते हैं — तो आपको रनटाइम में undefined मिलेगा। इसका उपयोग केवल तभी करें जब आप 100% आश्वस्त हों।
तरीका #4: गुण को वैकल्पिक बनाएं (?)
\n\nयदि