টাইপস্ক্রিপ্টে, কী! (বিস্ময়বোধক চিহ্ন / ঠুং শব্দ) অপারেটর যখন কোনও সদস্যকে অবজ্ঞা করেন?


451

Tslint নিয়মের জন্য সোর্সকোডের দিকে তাকানোর সময় আমি নীচের বিবৃতিটি দেখতে পেয়েছি:

if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

!অপারেটর পরে লক্ষ্য করুন node.parent। মজাদার!

আমি বর্তমানে স্থানীয়ভাবে টিএস (1.5.3) ইনস্টল করা সংস্করণ দিয়ে স্থানীয়ভাবে ফাইলটি সংকলনের চেষ্টা করেছি। ফলস্বরূপ ত্রুটিটি ঠুং শব্দটির সঠিক অবস্থানকে নির্দেশ করেছে:

$ tsc --noImplicitAny memberAccessRule.ts 
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.

পরবর্তী আমি সর্বশেষ টিএসে আপগ্রেড করেছি (২.১..6), এটি ইস্যু ছাড়াই সংকলন করেছে। সুতরাং এটি টিএস 2.x এর বৈশিষ্ট্য বলে মনে হচ্ছে। তবে প্রতিস্থাপনটি পুরোপুরি ঠাট্টা-বিদ্রূপকে উপেক্ষা করেছে, এর ফলে নিম্নলিখিত জেএস:

if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

আমার গুগল ফু আমাকে এতদিন ব্যর্থ করেছে।

টিএস এর বিস্ময়বোধক অপারেটর কী এবং এটি কীভাবে কাজ করে?

উত্তর:


685

এটাই নন-নাল আসক্তি অপারেটর। এটা একটা উপায় কম্পাইলার বলতে "এই অভিব্যক্তি হতে পারে না nullবা undefinedএখানে, তাই এটি হচ্ছে সম্ভাবনা সম্পর্কে অভিযোগ না nullবা undefined।" কখনও কখনও টাইপ পরীক্ষক নিজেই এই সংকল্পটি তৈরি করতে অক্ষম হন।

এটি এখানে ব্যাখ্যা করা হয়েছে :

কোনও নতুন !পোস্ট-ফিক্স এক্সপ্রেশন অপারেটর দৃ as়তার জন্য ব্যবহৃত হতে পারে যে এর অপারেন্ডটি প্রাসঙ্গিক ক্ষেত্রে নন-নাল এবং অপরিজ্ঞাত নয় যেখানে টাইপ চেকার সেই সত্যটি উপস্থাপন করতে অক্ষম। বিশেষত, অপারেশনটি x!ধরণের এবং বাদ xদিয়ে একটি মান তৈরি করে । ফরম গবেষকেরা টাইপ অনুরূপ এবং , অ নাল কথন অপারেটর কেবল নির্গত জাভাস্ক্রিপ্ট কোড মধ্যে মুছে ফেলা হবে।nullundefined<T>xx as T!

"ব্যাখ্যা" শব্দের ব্যবহারটি আমি এই ব্যাখ্যায় কিছুটা বিভ্রান্তিকর বলে মনে করি। এটি সেই অর্থে "জোর দেওয়া" যে বিকাশকারী এটি দৃ as়তার সাথে বিবেচনা করছেন, সেই অর্থে নয় যে কোনও পরীক্ষা অনুষ্ঠিত হতে চলেছে। শেষ লাইনটি প্রকৃতপক্ষে ইঙ্গিত দেয় যে এর ফলস্বরূপ কোনও জাভাস্ক্রিপ্ট কোড নির্গত হচ্ছে না।


102
অস্পষ্টতাকে 'দৃsert়ভাবে জানাতে' ভাল কল।
এস্তাস ফ্লাস্ক

8
ভাল ব্যাখ্যা। আমি এটির পরে console.assert()অ্যাড করার আগে প্রশ্নে ভেরিয়েবলটি করা একটি ভাল অনুশীলন বলে মনে !করি। অ্যাড !সংকলককে নাল চেক উপেক্ষা করতে বলছে, এটি জাভাস্ক্রিপ্টে নূরে সংকলিত। সুতরাং যদি আপনি নিশ্চিত না হন যে ভেরিয়েবলটি নাল নয়, তবে আরও ভালভাবে একটি স্পষ্ট জোড় চেক করুন।
জয়েশ

12
প্রেরণাদায়ক উদাহরণ হিসাবে: dict.has(key) ? dict.get(key) : 'default';টিএস সংকলকের মতো কোড সহ নতুন ইএস মানচিত্র প্রকারটি ব্যবহার করা এই অনুমান করতে পারে না যে getকলটি কখনই বাতিল / অপরিজ্ঞাত ফেরত দেয় না। dict.has(key) ? dict.get(key)! : 'default';টাইপ সঠিকভাবে সংকীর্ণ।
kitsu.eb

1
এলভিস অপারেটরটি কীভাবে বাইনারি অপারেটরকে বোঝায়, এই অপারেটরের জন্য কী অপমানজনক রয়েছে?
ইবাকুনিন

@ জয়েশ আপনি কনসোল.অ্যাসেট () ভাল অনুশীলনে প্রসারিত করতে পারেন, আপনি কি উদাহরণ পোস্ট করতে পারেন?
ক্রিস্টোফার ফ্রান্সিসকো

167

লুইয়ের উত্তরটি দুর্দান্ত, তবে আমি ভেবেছিলাম যে আমি এটি সংক্ষিপ্তভাবে যোগ করার চেষ্টা করব:

ব্যাং অপারেটর কম্পাইলারকে "নাল নয়" সীমাবদ্ধতা সাময়িকভাবে শিথিল করতে বলে যা এটি অন্যথায় দাবি করতে পারে। এটি সংকলককে বলে: "বিকাশকারী হিসাবে, আমি আপনার চেয়ে আরও ভাল জানি যে এই পরিবর্তনশীলটি এখনই নাল হতে পারে না"।


85
তারপরে, বিকাশকারী হিসাবে, আপনি গোলযোগ পেয়ে গেছেন।
মাইক চেম্বারলাইন

8
বা, সংকলক হিসাবে, এটি গোলযোগ পেয়েছে। যদি কনস্ট্রাক্টর কোনও সম্পত্তি আরম্ভ না করে তবে একটি জীবনচক্রী হুক এটি করে এবং সংকলক এটি সনাক্ত করে না।
মুকুস

26
এটি টিএস সংকলকের দায়িত্ব নয়। কিছু অন্যান্য ভাষার (যেমন সি। #) থেকে পৃথক, জেএস (এবং তাই টিএস) দাবি করে না যে ব্যবহারের আগে ভেরিয়েবলগুলি আরম্ভ করা উচিত। অথবা, এটি অন্য কোনও উপায়ে দেখার জন্য, জেএসে সমস্ত ভেরিয়েবলগুলি ঘোষিত varবা letস্পষ্টভাবে আরম্ভ করা হয়েছে undefined। তদুপরি, শ্রেণীর উদাহরণ বৈশিষ্ট্যগুলি যেমন ঘোষণা করা যেতে পারে, তাই class C { constructor() { this.myVar = undefined; } }পুরোপুরি আইনী। অবশেষে, লাইফাইসাইকেল হুকগুলি ফ্রেমওয়ার্ক নির্ভর; উদাহরণস্বরূপ কৌণিক এবং প্রতিক্রিয়া এগুলি আলাদাভাবে প্রয়োগ করে। সুতরাং টিএস সংকলক এগুলি সম্পর্কে তর্ক করার আশা করা যায় না।
মাইক চেম্বারলাইন

1
টিএস-তে নিয়ন্ত্রণ প্রবাহ ভিত্তিক প্রকার বিশ্লেষণের দুর্দান্ততার কথা বিবেচনা করে ব্যাং অপারেটরের কি বৈধ ব্যবহারের কেস রয়েছে?
ইউজিন কারটায়েভ

@ ইউজিন কারটায়েভ হ্যাঁ আছে, ফ্রেমওয়ার্কগুলি প্রায়শই নিজের ভিতরে পরিবর্তনশীল সূচনা করে এবং টিএস নিয়ন্ত্রণ প্রবাহ বিশ্লেষণ এটি ধরতে পারে না। এটির ব্যবহার অবশ্যই হ্রাস পেয়েছে তবে আপনি যেখানে এটি প্রয়োজন সেগুলি নজরে আসবেন।
arg20
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.