«Type 'string' is not assignable to type» — यह क्या है और आप यहाँ क्यों हैं?
\n\nअगर आपने कभी TypeScript में कोड लिखा है, तो आपने एडिटर में लाल रंग की अंडरलाइन और यह संदेश ज़रूर देखा होगा:
\n\nType 'string' is not assignable to type 'SomeType'.\n\nयह त्रुटि सख्त टाइपिंग (strict typing) की ओर से एक तरह का "नमस्ते" है। यह शुरुआती लोगों को डराती है, लेकिन वास्तव में यह डेवलपर की सबसे अच्छी दोस्त है। इस लेख में हम समझेंगे कि Type 'string' is not assignable to type त्रुटि क्यों होती है, इसे कैसे ठीक करें, और string literals, union types और generics के साथ काम करने के विभिन्न तरीके क्या हैं। यह लेख pythonlib.ru शैक्षिक साइट के लिए लिखा गया है, लेकिन सभी उदाहरण TypeScript में हैं।
\n\n1. समस्या की जड़: TypeScript स्ट्रिंग्स पर क्यों भड़कता है?
\n\nTypeScript, JavaScript का एक सुपरसेट है जो स्टैटिक टाइपिंग जोड़ता है। जब आप लिखते हैं:
\n\nlet role: 'admin' | 'user' = 'admin';\nrole = 'moderator'; // त्रुटि: Type '"moderator"' is not assignable to type '"admin" | "user"'\n\n\nTypeScript समझता है कि वेरिएबल role केवल दो मान ले सकता है: 'admin' या 'user'। जब आप 'moderator' असाइन करने की कोशिश करते हैं, तो कंपाइलर त्रुटि देता है। लेकिन यह «Type 'string' is not assignable to type» क्यों लिखता है?
इसका कारण यह है कि स्ट्रिंग लिटरल 'moderator' का टाइप string है, जबकि अपेक्षित टाइप 'admin' | 'user' है। TypeScript वैल्यू की नहीं, बल्कि टाइप की तुलना करता है। वह देखता है: "तुम मुझे एक सामान्य स्ट्रिंग दे रहे हो, जबकि मैं विशिष्ट स्ट्रिंग्स की उम्मीद कर रहा हूँ।" यही संदेश का कारण है।
1.1. समझने के लिए एक सरल उदाहरण
\n\nएक बुनियादी मामला देखते हैं:
\n\ntype Status = 'active' | 'inactive';\n\nfunction updateStatus(status: Status) {\n console.log(status);\n}\n\nconst myStatus = 'active';\nupdateStatus(myStatus); // ठीक है\n\nconst anotherStatus = 'pending';\nupdateStatus(anotherStatus); // त्रुटि: Type 'string' is not assignable to type 'Status'\n\n\nआखिरी मामले में, वेरिएबल anotherStatus का टाइप string निकाला जाता है, न कि 'pending'। TypeScript को नहीं पता कि 'pending' एक लिटरल है। वह केवल string टाइप देखता है। इसे ठीक करने के लिए, टाइप स्पष्ट रूप से बताएँ:
const anotherStatus: 'pending' = 'pending'; // अब काम करेगा\n\n\n2. तरीकों की तुलना: त्रुटि को कैसे दूर करें या ठीक करें
\n\nType 'string' is not assignable to type त्रुटि से निपटने के कई तरीके हैं। हम उनकी सरलता, सुरक्षा और प्रदर्शन के आधार पर तुलना करेंगे।
\n\n2.1. तरीका 1: as const — लिटरल को फ्रीज़ करें
\n\nसबसे सुंदर तरीका as const का उपयोग करना है। यह वैल्यू को एक लिटरल के रूप में "फ्रीज़" कर देता है:
const myStatus = 'active' as const;\nupdateStatus(myStatus); // ठीक है\n\n\nफायदे: सरल, पढ़ने में आसान, सुरक्षित।
\nनुकसान: केवल const के साथ काम करता है, let के साथ नहीं।
2.2. तरीका 2: Type Assertion (as) — स्पष्ट रूपांतरण
\n\nआप TypeScript से कह सकते हैं: "मुझे पता है मैं क्या कर रहा हूँ":
\n\nconst someString: string = 'active';\nupdateStatus(someString as Status); // ठीक है\n\n\nफायदे: त्वरित समाधान।
\nनुकसान: आप टाइप चेकिंग को बंद कर देते हैं। अगर गलत वैल्यू दी, तो त्रुटि रनटाइम में ही दिखेगी।
2.3. तरीका 3: Type Guard (टाइप गार्ड)
\n\nएक फंक्शन लिखें जो जाँचे कि स्ट्रिंग एक मान्य स्टेटस है या नहीं:
\n\nfunction isStatus(value: string): value is Status {\n return value === 'active' || value === 'inactive';\n}\n\nfunction safeUpdate(value: string) {\n if (isStatus(value)) {\n updateStatus(value); // TypeScript जानता है कि value — Status है\n } else {\n throw new Error('अमान्य स्टेटस');\n }\n}\n