টাইপস্ক্রিপ্টে ত্রুটিটি "টাইপের প্যারামিটারে কখনই অর্পণযোগ্য নয়" কী?


162

কোডটি হ'ল:

const foo = (foo: string) => {
  const result = []
  result.push(foo)
}

আমি নিম্নলিখিত টিএস ত্রুটি পেয়েছি:

[ts] 'স্ট্রিং' টাইপের আর্গুমেন্ট 'কখনই নয়' টাইপের প্যারামিটারে অর্পণযোগ্য নয়।

আমি কি ভুল করছি? এটি কি বাগ?

উত্তর:


251

আপনাকে যা করতে হবে তা হ'ল resultনীচের মত একটি স্ট্রিং অ্যারে হিসাবে আপনার সংজ্ঞা দেওয়া :

const result : string[] = [];

অ্যারের প্রকারটি সংজ্ঞায়িত না করে এটি ডিফল্টরূপে হবে never। সুতরাং আপনি যখন এটিতে একটি স্ট্রিং যুক্ত করার চেষ্টা করেছিলেন, তখন এটি একটি প্রকারের অমিল ছিল এবং তাই আপনি যে ত্রুটিটি দেখেছেন তা ছুঁড়ে দিয়েছে।


6
এটা আমার কাছে উদ্ভট বলে মনে হচ্ছে, ডিফল্ট কেন never[]? "অ্যারে যে সবসময় খালি থাকবে" ব্যতীত এর জন্য কি কখনও ব্যবহার রয়েছে?
— ভিনসেন্ট বাসকারেলো

6
আমি সম্পূর্ণরূপে একমত কারণ, সত্যি বলতে, আমি কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না যে এর অ্যারে neverদরকারী হবে। তবে এটি সন্ধান করার সময় আমি এই উত্তরটি পেলাম যার মধ্যে দুর্দান্ত তথ্য রয়েছে।
— থায়ার এম। আল-আজলৌনি

8
ডিফল্ট টাইপটি "কোনও" হওয়া উচিত নয়? যখন আপনি কোনও ভেরিয়েবল ( let x;) ঘোষণা করেন এটি anyডিফল্টরূপে টাইপ হয়। না never।
— শচর হার-শুভ

1
অবশ্যই টাইপ ছাড়াই একটি অ্যারের আশা করবে any[]। অবাক হয়েছিল never[]যে এটি অকেজো করে তোলে। Unintuitive। উত্তর করার জন্য ধন্যবাদ. সম্পাদনা: ব্যাকরণ
— ইগোর ম্যালিক

4
@ ভিনসেন্টবুসারেলো আমার ধারণা, এই জাতীয় ডিফল্টের মূল বিষয় হ'ল একজনকে সর্বদা তাদের অ্যারেতে টাইপ যুক্ত করা; তবে ত্রুটি বার্তাটি অবশ্যই সহায়ক নয়।
— ইয়াকভএল

27

আরেকটি উপায় হ'ল:

const result = [] as  any;

8
আসলে ব্যবহার anyকরা ভাল বিকল্প নয়, কারণ এটি মূলত কোনও টাইপস্ক্রিপ্ট বৈশিষ্ট্য বন্ধ করে দেয়। এটি একটি কার্যকরী এবং বিভিন্ন বাগের দিকে নিয়ে যেতে পারে।
— টোমেক বুসেজেউস্কি

1
হ্যাঁ. তবে কখনও কখনও অন্য কিছু কাজ করে না বিশেষত আপনি যখন তৃতীয় পক্ষের লাইব্রেরি নিয়ে কাজ করছেন ..
— neomib

14

এটি সাম্প্রতিক প্রতিরোধ বা টাইপস্ক্রিপ্টে কিছু অদ্ভুত আচরণ বলে মনে হচ্ছে। আপনার যদি কোডটি থাকে:

const result = []

সাধারণত এটি এমনভাবে ব্যবহার করা হবে যেমনটি আপনি লিখেছেন:

const result:any[] = []

তবে আপনার সিএসকিফাইজে যদি আপনার noImplicitAnyমিথ্যা এবং strictNullChecks সত্য দুটি থাকে তবে এটি হিসাবে বিবেচিত হবে:

const result:never[] = []

এই আচরণটি সমস্ত যুক্তি, আইএমএইচওকে অস্বীকার করে। নাল চেকগুলি চালু করা একটি অ্যারের প্রবেশের ধরণের পরিবর্তন করে ?? এবং তারপরে চালু করা কোনও সতর্কতা ছাড়াই noImplicitAnyব্যবহার পুনরুদ্ধার করে any??

আপনার যদি সত্যই অ্যারে থাকে any, আপনার অতিরিক্ত কোড সহ এটি নির্দেশ করার প্রয়োজন হবে না।


10

আমি একই ভুল চাপ ছিল ReactJS statless ফাংশন যখন ReactJs হুক ব্যবহার useState । আমি একটি অবজেক্ট অ্যারের স্থিতি সেট করতে চেয়েছিলাম, সুতরাং যদি আমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করি

const [items , setItems] = useState([]);

এবং এই জাতীয় অবস্থা আপডেট করুন:

 const item = { id : new Date().getTime() , text : 'New Text' };
 setItems([ item , ...items ]);

আমি ত্রুটি পাচ্ছিলাম:

'' ID: সংখ্যা প্রকারের যুক্তি; পাঠ্য: '} কখনও না' টাইপের প্যারামিটারে কোনও} 'নির্ধারিত নয়

তবে যদি এটি এটি করে,

const [items , setItems] = useState([{}]);

ত্রুটি চলে গেছে তবে 0 সূচীতে একটি আইটেম রয়েছে যার কোনও ডেটা নেই (এটি চান না)।

সুতরাং আমি যে সমাধানটি পেয়েছি তা হ'ল:

const [items , setItems] = useState([] as any);

7

রিঅ্যাক্টজেএস ফাংশন উপাদানটিতে আমি একই ত্রুটি পেয়েছি, রিঅ্যাক্টজেএস ব্যবহার স্টেট হুক ব্যবহার করে। সমাধানটি ছিল প্রারম্ভিক সময়ে ব্যবহারের স্ট্যাটটির ধরণটি ঘোষণা করা:

const [items , setItems] = useState<IItem[]>([]); // replace IItem[] with your own typing: string, boolean...

3

আমি খালি বন্ধনীগুলির পরিবর্তে অ্যারে কীওয়ার্ডটি ব্যবহার করে এটি পেরেছি:

const enhancers: Array<any> = [];

ব্যবহার করুন:

if (typeof devToolsExtension === 'function') {
  enhancers.push(devToolsExtension())
}

2

আপনাকে resultস্ট্রিংয়ের একটি অ্যারে টাইপ করতে হবে const result: string[] = [];।



1

"কঠোরতম নলচেকস" সরান : "সংকলক অপশনগুলি" থেকে সত্য বা আপনার এনজি অ্যাপ্লিকেশনটির tsconfig.json ফাইলটিতে এটি মিথ্যাতে সেট করুন। এই ত্রুটিগুলি যে কোনও কিছুর মতো চলে যাবে এবং আপনার অ্যাপ্লিকেশন সফলভাবে সংকলন করবে।

দাবি অস্বীকার : এটি কেবলমাত্র এক কর্মচঞ্চল। এই ত্রুটিটি তখনই উপস্থিত হয় যখন নাল চেকগুলি সঠিকভাবে পরিচালনা করা হয় না যা কোনও অবস্থাতেই জিনিসগুলি সম্পন্ন করার পক্ষে ভাল উপায় নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.