বেশ কয়েকটি পরিস্থিতি রয়েছে যা আপনাকে এই বিশেষ ত্রুটিটি দেবে। ওপির ক্ষেত্রে স্ট্রিং হিসাবে স্পষ্টভাবে সংজ্ঞায়িত একটি মান ছিল । সুতরাং আমি ধরে নিতে হবে যে এটি সম্ভবত একটি ড্রপডাউন, বা ওয়েব পরিষেবা বা কাঁচা জেএসএন স্ট্রিং থেকে এসেছে।
সেক্ষেত্রে একটি সাধারণ castালাই <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
) কেবল 'castালাই' দিয়ে কী সমস্যা হয়েছে?
// 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>
এবং আপনি সংকলককে বলছেন একটি কুকুর একটি ফিল্ডআররটাইপ ! এবং সংকলক এটি অনুমতি দেবে!
তবে আপনি যদি নিম্নলিখিতটি করেন তবে সংকলক স্ট্রিংটিকে কোনও প্রকারে রূপান্তর করবে
<'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!
সমস্যাটি সমাধানের আরেকটি উপায় হ'ল প্যারেন্ট অবজেক্টটি ingালাই:
আমার সংজ্ঞাগুলি নিম্নরূপ ছিল:
রফতানির প্রকার FieldName = 'সংখ্যা' | 'এক্সপায়ারডেট' | 'CVV'; রফতানির ধরন FieldError = 'কিছুই নয়' 'নিখোঁজ' | 'অবৈধ'; রফতানির ধরন ফিল্ডেররর টাইপ = {ক্ষেত্র: ক্ষেত্রের নাম, ত্রুটি: ফিল্ডআরর};
ধরা যাক আমরা এটির সাথে একটি ত্রুটি পেয়েছি (স্ট্রিংটি নির্ধারণযোগ্য ত্রুটিটি নয়):
fieldErrors: [ { field: 'number', error: 'invalid' } ]
আমরা পুরো অবজেক্টকে এর মতো 'দৃ as়' করতে পারি FieldErrorType
:
fieldErrors: [ <FieldErrorType> { field: 'number', error: 'invalid' } ]
তারপরে আমরা করণীয় এড়িয়ে চলি <'invalid'> 'invalid'
।
তবে টাইপসের কী হবে? যে ধরণের হতে পারে ডানদিকে যা আছে তা <FieldErrorType>
কেবল জোড় করে না। না এই ক্ষেত্রে - সৌভাগ্যবশত কম্পাইলার হবে অভিযোগ যদি আপনি এই কাজ করতে, কারণ এটি এটা অসম্ভব জানেন যে চালাক যথেষ্ট:
fieldErrors: [ <FieldErrorType> { field: 'number', error: 'dog' } ]
export type Fruit
?