कई परिस्थितियां हैं जो आपको यह विशेष त्रुटि देगी। ओपी के मामले में एक स्ट्रिंग के रूप में स्पष्ट रूप से परिभाषित मूल्य था । इसलिए मुझे यह मानना होगा कि शायद यह एक ड्रॉपडाउन, या वेब सर्विस या रॉ JSON स्ट्रिंग से आया है।
उस मामले में एक साधारण कास्ट <Fruit> fruitString
या fruitString as Fruit
एकमात्र समाधान है (अन्य उत्तर देखें)। आप कभी भी संकलन के समय इस पर सुधार नहीं कर पाएंगे। [ संपादित करें: मेरे अन्य उत्तर देखें<const>
]!
हालांकि आपके कोड में स्थिरांक का उपयोग करते समय यह उसी त्रुटि में चलाना बहुत आसान है जो कभी भी टाइप स्ट्रिंग के लिए अभिप्रेत नहीं है । मेरा उत्तर उस दूसरे परिदृश्य पर केंद्रित है:
सबसे पहले: क्यों 'जादू' स्ट्रिंग स्थिरांक अक्सर एक एनम से बेहतर होते हैं?
- जिस तरह से एक स्ट्रिंग स्थिर बनाम एक एनम - यह कॉम्पैक्ट और 'जावास्क्रिप्ट' है
- यदि आप पहले से उपयोग किए जा रहे घटक को स्ट्रिंग स्थिरांक का उपयोग करते हैं तो अधिक समझ में आता है।
- 'एनुम प्रकार' को आयात करने के लिए केवल एन्यूमरेशन वैल्यू प्राप्त करना अपने आप में परेशानी भरा हो सकता है
- जो कुछ भी मैं चाहता हूं कि वह सुरक्षित रूप से संकलित हो जाए, इसलिए यदि मैं यूनियन प्रकार से एक वैध मान हटाता हूं, या इसे गलत करता हूं, तो यह एक संकलित त्रुटि देना होगा।
सौभाग्य से जब आप परिभाषित करते हैं:
export type FieldErrorType = 'none' | 'missing' | 'invalid'
... आप वास्तव में प्रकारों के एक संघ को परिभाषित कर रहे हैं जहां 'missing'
वास्तव में एक प्रकार है!
अगर मैं 'banana'
अपनी टाइपस्क्रिप्ट में एक स्ट्रिंग की तरह है , तो मैं अक्सर 'नियत नहीं' त्रुटि में चला जाता हूं और संकलक सोचता है कि मेरा मतलब एक स्ट्रिंग के रूप में था, जबकि मैं वास्तव में चाहता था कि यह टाइप का हो banana
। कंपाइलर कितना स्मार्ट हो सकता है, यह आपके कोड की संरचना पर निर्भर करेगा।
आज मुझे यह त्रुटि कब मिली, इसका एक उदाहरण है:
// this gives me the error 'string is not assignable to type FieldErrorType'
fieldErrors: [ { fieldName: 'number', error: 'invalid' } ]
जैसे ही मुझे पता चला कि 'invalid'
या 'banana'
तो एक प्रकार या एक स्ट्रिंग हो सकता है मुझे एहसास हुआ कि मैं उस प्रकार में एक स्ट्रिंग को मुखर कर सकता हूं । अनिवार्य रूप से इसे खुद को कास्ट करें , और संकलक को बताएं कि मैं नहीं चाहता कि यह एक स्ट्रिंग हो !
// so this gives no error, and I don't need to import the union type too
fieldErrors: [ { fieldName: 'number', error: <'invalid'> 'invalid' } ]
तो क्या सिर्फ (कास्टिंग ) FieldErrorType
या ( Fruit
) के लिए गलत है
// why not do this?
fieldErrors: [ { fieldName: 'number', error: <FieldErrorType> 'invalid' } ]
यह संकलित समय सुरक्षित नहीं है:
<FieldErrorType> 'invalidddd'; // COMPILER ALLOWS THIS - NOT GOOD!
<FieldErrorType> 'dog'; // COMPILER ALLOWS THIS - NOT GOOD!
'dog' as FieldErrorType; // COMPILER ALLOWS THIS - NOT GOOD!
क्यों? यह टाइपस्क्रिप्ट है, इसलिए <FieldErrorType>
यह एक जोर है और आप कंपाइलर को एक कुत्ता एक FieldErrorType बता रहे हैं ! और संकलक इसे अनुमति देगा!
लेकिन अगर आप निम्नलिखित करते हैं, तो संकलक स्ट्रिंग को एक प्रकार में बदल देगा
<'invalid'> 'invalid'; // THIS IS OK - GOOD
<'banana'> 'banana'; // THIS IS OK - GOOD
<'invalid'> 'invalidddd'; // ERROR - GOOD
<'dog'> 'dog'; // ERROR - GOOD
बस इस तरह बेवकूफ टाइपो के लिए बाहर देखो:
<'banana'> 'banan'; // PROBABLY WILL BECOME RUNTIME ERROR - YOUR OWN FAULT!
समस्या को हल करने का दूसरा तरीका मूल ऑब्जेक्ट को कास्टिंग करके है:
मेरी परिभाषाएँ इस प्रकार थीं:
निर्यात प्रकार FieldName = 'संख्या' | 'समाप्ति ’| 'सीवीवी'; निर्यात प्रकार FieldError = 'कोई नहीं' | 'लापता' | 'अमान्य'; निर्यात प्रकार FieldErrorType = {फ़ील्ड: FieldName, त्रुटि: FieldError};
मान लें कि हमें इसके साथ एक त्रुटि मिलती है (स्ट्रिंग उपलब्ध नहीं त्रुटि):
fieldErrors: [ { field: 'number', error: 'invalid' } ]
हम पूरी वस्तु को FieldErrorType
इस तरह 'मुखर' कर सकते हैं :
fieldErrors: [ <FieldErrorType> { field: 'number', error: 'invalid' } ]
तब हम करने से बचते हैं <'invalid'> 'invalid'
।
लेकिन टाइपो के बारे में क्या? नहीं करता है <FieldErrorType>
बस ज़ोर जो कुछ उस प्रकार के होने का अधिकार पर है। इस मामले में नहीं - सौभाग्य से कंपाइलर शिकायत करेगा यदि आप ऐसा करते हैं, क्योंकि यह काफी चालाक है यह जानना असंभव है:
fieldErrors: [ <FieldErrorType> { field: 'number', error: 'dog' } ]
export type Fruit
?