परिचय: आपका TypeScript कोड अजीब व्यवहार क्यों करता है?
\nक्या आपने कभी TypeScript में कुछ इस तरह लिखा है:
\nconst direction = 'left';\n// ... और फिर TypeScript ने कहा कि यह string है, 'left' नहीं?\nपरिचित लगता है? यह सबसे आम जालों में से एक है जिसमें अनुभवी डेवलपर भी फंस जाते हैं। आज हम एक शक्तिशाली उपकरण पर चर्चा करेंगे जो इस समस्या को हमेशा के लिए हल करता है — as const।
\nइस लेख का विषय Stack Overflow पर एक वास्तविक प्रश्न पर आधारित है, जिसे हज़ारों बार देखा गया है: "TypeScript में "as const" का क्या अर्थ है और इसका उपयोग क्या है?"। हम इस प्रश्न को शैक्षिक सामग्री के लिए अनुकूलित करेंगे, वास्तविक उदाहरण जोड़ेंगे और दिखाएंगे कि कैसे TypeScript में as const बेवकूफी भरी गलतियों से बचने में मदद करता है।
\nतैयार हैं? चलिए शुरू करते हैं!
\n\n\n\n
सरल शब्दों में TypeScript में as const क्या है?
\nas const — एक विशेष निर्माण (const assertion) है जो TypeScript से कहता है: "अरे, प्रकार का विस्तार मत करो! इस मान को एक शाब्दिक के रूप में फ्रीज़ कर दो।" दूसरे शब्दों में, आप TypeScript को अधिक सामान्य प्रकार (जैसे, string) निकालने से रोकते हैं और इसे सटीक मान का उपयोग करने के लिए मजबूर करते हैं।
as const के बिना समस्या
\nएक सरल उदाहरण देखें:
\n// as const के बिना\nconst role = 'admin'; // TypeScript प्रकार निकालेगा: 'admin' (क्योंकि const)\nlet userRole = 'admin'; // TypeScript प्रकार निकालेगा: string (क्योंकि let)\n\n// और अब एक सरणी:\nconst roles = ['admin', 'user', 'guest']; \n// TypeScript निकालेगा: string[]\n\nजब आप let या सरणी का उपयोग करते हैं, तो TypeScript प्रकार को अधिक सामान्य में "विस्तारित" करता है। यह तार्किक है: चर बदल सकता है, सरणी उत्परिवर्तित हो सकती है। लेकिन 90% मामलों में, आपको सटीक मान की आवश्यकता होती है!
as const के साथ समाधान
\nconst roles = ['admin', 'user', 'guest'] as const;\n// TypeScript निकालेगा: readonly ["admin", "user", "guest"]\n\nconst config = {\n api: 'https://api.example.com',\n timeout: 5000\n} as const;\n// TypeScript निकालेगा:\n// {\n// readonly api: "https://api.example.com";\n// readonly timeout: 5000;\n// }\n\nअब TypeScript सटीक शाब्दिक जानता है। कोई string या number नहीं — केवल विशिष्ट मान। यही TypeScript में as const का जादू है।
\n\n
as const के साथ काम करते समय शीर्ष-5 गलतियाँ (और उनसे कैसे बचें)
\nयह जानने के बावजूद कि as const क्या है, डेवलपर अक्सर एक ही गलतियाँ करते हैं। आइए वास्तविक मामलों पर उन पर चर्चा करें।
\n\nगलती नंबर 1: readonly ऑब्जेक्ट को बदलने का प्रयास
\nजब आप as const का उपयोग करते हैं, तो ऑब्जेक्ट या सरणी readonly हो जाती है। उन्हें बदलने का प्रयास करने पर संकलन त्रुटि होगी।
खराब:
\nconst colors = ['red', 'green', 'blue'] as const;\ncolors.push('yellow'); // त्रुटि! प्रकार 'readonly [...]' पर 'push' गुण मौजूद नहीं है\n\nकैसे बचें:
\nयदि आपको एक उत्परिवर्तनीय सरणी चाहिए, तो as const का उपयोग न करें। या एक प्रतिलिपि का उपयोग करें:
const colors = ['red', 'green', 'blue'] as const;\nconst mutableColors = [...colors]; // अब यह एक सामान्य सरणी है\nmutableColors.push('yellow'); // काम करता है\n\n\nगलती नंबर 2: नेस्टेड ऑब्जेक्ट के बारे में भूल जाना
\nas const पुनरावर्ती रूप से काम करता है — यह सभी नेस्टेड गुणों को readonly बनाता है। कई लोग इसके बारे में भूल जाते हैं।
\nउदाहरण:
\nconst theme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d'\n }\n} as const;\n\ntheme.colors.primary = '#000'; // त्रुटि! 'primary' को असाइन नहीं कर सकता क्योंकि यह एक read-only गुण है।\n\nकैसे बचें:
\nयदि आपको केवल ऑब्जेक्ट का एक भाग बदलना है, तो सतही as const करें या आंशिक प्रकारों का उपयोग करें।
गलती नंबर 3: as const के साथ और बिना तुलना
\nकभी-कभी डेवलपर व्यवहार को भ्रमित करते हैं