TypeScript में never प्रकार: "not assignable to parameter" त्रुटि को कैसे ठीक करें

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

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

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

परिचय: TypeScript खाली सरणी पर क्यों चिल्लाता है?

\n\n

क्या आपने कभी TypeScript में कोड लिखा, कंपाइलेशन चलाया, और जवाब में एक रहस्यमय संदेश मिला: "Argument of type 'X' is not assignable to parameter of type 'never'"? यदि हाँ — तो आप अकेले नहीं हैं। यह त्रुटि सभी स्तरों के डेवलपर्स के लिए एक वास्तविक बाधा है। Stack Overflow पर इस प्रश्न को हजारों बार देखा गया है, और आज हम इसे हमेशा के लिए समझ लेंगे।

\n\n

एक स्थिति की कल्पना करें: आप एक खाली सरणी घोषित करते हैं, उसमें कुछ जोड़ने का प्रयास करते हैं, और TypeScript ऑपरेशन को ब्लॉक कर देता है। परिचित लगता है? आइए समझते हैं कि ऐसा क्यों होता है और, सबसे महत्वपूर्ण, इसे कैसे ठीक किया जाए।

\n\n

इस लेख में हम केवल सूखे दस्तावेज़ का अनुवाद नहीं करेंगे। हम त्रुटि के प्रकट होने से लेकर वास्तविक उदाहरणों के साथ इसके पूर्ण समाधान तक का सफर तय करेंगे, जिन्हें आप तुरंत अपनी परियोजनाओं में लागू कर सकते हैं।

\n\n

TypeScript में never प्रकार क्या है?

\n\n

त्रुटियों की गहराई में जाने से पहले, आइए never प्रकार को ही समझ लें। TypeScript में यह प्रकार "एक ऐसा मान जो अस्तित्व में नहीं हो सकता" को दर्शाता है। यह दार्शनिक लगता है, लेकिन व्यवहार में सब कुछ सरल है:

\n\n
    \n
  • never — उन फ़ंक्शनों के लिए एक प्रकार है जो कभी समाप्त नहीं होते (अनंत लूप) या हमेशा एक अपवाद फेंकते हैं।
  • \n
  • never — टाइप सिस्टम का "तल" है। आप never को किसी भी चीज़ पर असाइन कर सकते हैं, लेकिन never को कुछ भी असाइन नहीं किया जा सकता (सिवाय स्वयं never के)।
  • \n
\n\n

अब कल्पना करें कि TypeScript एक खाली सरणी देखता है और नहीं जानता कि इसमें कौन से तत्व होंगे। सख्त टाइपिंग मोड (strict: true tsconfig.json में) में कंपाइलर एक तार्किक निष्कर्ष निकालता है: "यदि सरणी खाली है और प्रकार निर्दिष्ट नहीं है, तो इसका मतलब है कि इसमें कुछ भी नहीं हो सकता — तत्वों का प्रकार never है"।

\n\n
// उदाहरण: TypeScript प्रकार को never[] के रूप में निकालता है\nconst emptyArray = [];\nemptyArray.push("hello"); // त्रुटि!\n// Argument of type 'string' is not assignable to parameter of type 'never'\n
\n\n

यह रही वही त्रुटि। TypeScript ईमानदारी से चेतावनी देता है: "आपने कहा कि सरणी में केवल never हो सकता है, और आप एक स्ट्रिंग जोड़ने का प्रयास कर रहे हैं। यह नहीं चलेगा!"

\n\n

त्रुटि उत्पन्न होने के मुख्य परिदृश्य

\n\n

1. टाइप एनोटेशन के बिना खाली सरणी

\n\n

सबसे सामान्य मामला। डेवलपर एक खाली सरणी बनाता है, बाद में इसे भरने की योजना बनाता है, लेकिन प्रकार निर्दिष्ट करना भूल जाता है।

\n\n
// ❌ समस्या\nconst items = []; // TypeScript निकालता है: any[] (यदि strict: false) या never[] (यदि strict: true)\nitems.push({ id: 1, name: "Alice" }); // strict: true होने पर त्रुटि\n\n// ✅ समाधान: स्पष्ट रूप से प्रकार निर्दिष्ट करें\nconst items: Array<{ id: number; name: string }> = [];\nitems.push({ id: 1, name: "Alice" }); // काम करता है!\n
\n\n

2. सरणी विधियाँ जो never लौटाती हैं (filter, reduce)

\n\n

गलत प्रेडिकेट वाली filter विधि या प्रारंभिक मान के बिना reduce विधि never प्रकार निकाल सकती है।

\n\n
// ❌ filter के साथ समस्या\nconst numbers: (number | null)[] = [1, null, 2, null, 3];\nconst onlyNumbers = numbers.filter(item => item !== null); \n// TypeScript प्रकार को (number | null)[] या यहाँ तक कि never[] के रूप में निकाल सकता है, यदि प्रेडिकेट "टूटा हुआ" है\n\n// ✅ समाधान: type guard का उपयोग करें\nconst onlyNumbersSafe: number[] = numbers.filter((item): item is number => item !== null); \n\n// ❌ reduce के साथ समस्या\nconst result = [1, 2, 3].reduce((acc, val) => acc + val); \n// त्रुटि! TypeScript एक्युमुलेटर का प्रारंभिक प्रकार नहीं जानता\n\n// ✅ समाधान: प्रारंभिक मान निर्दिष्ट करें\nconst resultSafe = [1, 2, 3].reduce((acc, val) => acc + val, 0); // काम करता है!\n
\n\n

3. जेनेरिक और सशर्त प्रकार

\n\n

अधिक जटिल मामला — जब TypeScript जटिल सामान्यीकरण के कारण प्रकार नहीं निकाल पाता।

\n\n
// ❌ समस्या\nfunction getFirstElement<T>(arr: T[]): T | undefined {\n  return arr[0];\n}\n\nfunction processItems<T>                

ब्लॉग

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