TypeScript में 'Type 'string' is not assignable to type' त्रुटि को समझें और ठीक करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

«Type 'string' is not assignable to type» — यह क्या है और आप यहाँ क्यों हैं?

\n\n

अगर आपने कभी TypeScript में कोड लिखा है, तो आपने एडिटर में लाल रंग की अंडरलाइन और यह संदेश ज़रूर देखा होगा:

\n\n
Type '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\n

1. समस्या की जड़: TypeScript स्ट्रिंग्स पर क्यों भड़कता है?

\n\n

TypeScript, JavaScript का एक सुपरसेट है जो स्टैटिक टाइपिंग जोड़ता है। जब आप लिखते हैं:

\n\n
let role: 'admin' | 'user' = 'admin';\nrole = 'moderator'; // त्रुटि: Type '"moderator"' is not assignable to type '"admin" | "user"'\n
\n\n

TypeScript समझता है कि वेरिएबल role केवल दो मान ले सकता है: 'admin' या 'user'। जब आप 'moderator' असाइन करने की कोशिश करते हैं, तो कंपाइलर त्रुटि देता है। लेकिन यह «Type 'string' is not assignable to type» क्यों लिखता है?

\n\n

इसका कारण यह है कि स्ट्रिंग लिटरल 'moderator' का टाइप string है, जबकि अपेक्षित टाइप 'admin' | 'user' है। TypeScript वैल्यू की नहीं, बल्कि टाइप की तुलना करता है। वह देखता है: "तुम मुझे एक सामान्य स्ट्रिंग दे रहे हो, जबकि मैं विशिष्ट स्ट्रिंग्स की उम्मीद कर रहा हूँ।" यही संदेश का कारण है।

\n\n

1.1. समझने के लिए एक सरल उदाहरण

\n\n

एक बुनियादी मामला देखते हैं:

\n\n
type 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 टाइप देखता है। इसे ठीक करने के लिए, टाइप स्पष्ट रूप से बताएँ:

\n\n
const anotherStatus: 'pending' = 'pending'; // अब काम करेगा\n
\n\n

2. तरीकों की तुलना: त्रुटि को कैसे दूर करें या ठीक करें

\n\n

Type 'string' is not assignable to type त्रुटि से निपटने के कई तरीके हैं। हम उनकी सरलता, सुरक्षा और प्रदर्शन के आधार पर तुलना करेंगे।

\n\n

2.1. तरीका 1: as const — लिटरल को फ्रीज़ करें

\n\n

सबसे सुंदर तरीका as const का उपयोग करना है। यह वैल्यू को एक लिटरल के रूप में "फ्रीज़" कर देता है:

\n\n
const myStatus = 'active' as const;\nupdateStatus(myStatus); // ठीक है\n
\n\n

फायदे: सरल, पढ़ने में आसान, सुरक्षित।
\nनुकसान: केवल const के साथ काम करता है, let के साथ नहीं।

\n\n

2.2. तरीका 2: Type Assertion (as) — स्पष्ट रूपांतरण

\n\n

आप TypeScript से कह सकते हैं: "मुझे पता है मैं क्या कर रहा हूँ":

\n\n
const someString: string = 'active';\nupdateStatus(someString as Status); // ठीक है\n
\n\n

फायदे: त्वरित समाधान।
\nनुकसान: आप टाइप चेकिंग को बंद कर देते हैं। अगर गलत वैल्यू दी, तो त्रुटि रनटाइम में ही दिखेगी।

\n\n

2.3. तरीका 3: Type Guard (टाइप गार्ड)

\n\n

एक फंक्शन लिखें जो जाँचे कि स्ट्रिंग एक मान्य स्टेटस है या नहीं:

\n\n
function 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

ब्लॉग

पुस्तक अनुशंसाएँ