टाइपस्क्रिप्ट में, क्या है! (विस्मयादिबोधक चिह्न / धमाका) ऑपरेटर जब एक सदस्य को डीफ़र करते हैं?


453

जब मैं 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.

अगला मैंने नवीनतम टीएस (2.1.6) में अपग्रेड किया, जिसने इसे बिना किसी समस्या के संकलित किया। तो यह टीएस 2.x की विशेषता प्रतीत होती है। लेकिन वाष्पोत्सर्जन ने धमाके को पूरी तरह से नजरअंदाज कर दिया, जिसके परिणामस्वरूप निम्नलिखित जेएस:

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

मेरा Google फू इस प्रकार अब तक मुझे विफल रहा है।

टीएस के विस्मयादिबोधक चिह्न ऑपरेटर क्या है, और यह कैसे काम करता है?

जवाबों:


691

वह गैर-अशक्त मुखर ऑपरेटर है। यह संकलक को यह बताने का एक तरीका है "यह अभिव्यक्ति नहीं हो सकती है nullया undefinedयहां नहीं है , इसलिए इसे होने की संभावना के बारे में शिकायत न करें nullया undefined"। कभी-कभी टाइप चेकर उस निर्धारण को स्वयं करने में असमर्थ होता है।

यह यहाँ समझाया गया है :

एक नया !पोस्ट-फिक्स एक्सप्रेशन ऑपरेटर का उपयोग यह बताने के लिए किया जा सकता है कि इसका ऑपरेंड गैर-अशक्त और गैर-अपरिभाषित है संदर्भों में जहां टाइप चेकर उस तथ्य को समाप्त करने में असमर्थ है। विशेष रूप से, आपरेशन x!के प्रकार के एक मूल्य का उत्पादन xके साथ nullऔर undefinedबाहर रखा गया। रूपों के प्रकारों के प्रकार के समान <T>xऔर x as T, !गैर-शून्य अभिकथन ऑपरेटर को केवल उत्सर्जित जावास्क्रिप्ट कोड में हटा दिया जाता है।

मुझे उस स्पष्टीकरण में "भ्रामक" शब्द का उपयोग थोड़ा भ्रामक लगता है। यह इस अर्थ में "जोर" है कि डेवलपर इसे मुखर कर रहा है , इस अर्थ में नहीं कि एक परीक्षण किया जा रहा है। अंतिम पंक्ति वास्तव में इंगित करती है कि इसके परिणामस्वरूप कोई जावास्क्रिप्ट कोड उत्सर्जित नहीं होता है।


102
'जोर' अस्पष्टता पर अच्छा कॉल।
एस्टस फ्लास्क

8
अच्छे खर्च। मुझे लगता है कि एक console.assert()प्रश्न के !बाद इसे लागू करने से पहले चर पर एक अच्छा अभ्यास करना है। क्योंकि ऐड !कंपाइलर को नल चेक को नजरअंदाज करने के लिए कह रहा है, यह जावास्क्रिप्ट में नोज करने के लिए कंपाइल करता है। इसलिए यदि आप सुनिश्चित नहीं हैं कि चर गैर-अशक्त है, तो बेहतर रूप से स्पष्ट मुखर जांच करें।
जयेश

12
एक प्रेरक उदाहरण के रूप में: dict.has(key) ? dict.get(key) : 'default';टीएस कंपाइलर जैसे कोड के साथ नए ईएस मैप प्रकार का उपयोग यह अनुमान नहीं लगा सकता है कि getकॉल कभी भी अशक्त / अपरिभाषित नहीं होता है। dict.has(key) ? dict.get(key)! : 'default';प्रकार को सही ढंग से बताता है।
kitsu.eb

1
क्या इस ऑपरेटर के लिए कोई कठबोली है, जैसे कि एल्विस ऑपरेटर बाइनरी ऑपरेटर को कैसे संदर्भित करता है?
इबाकुनिन

@ जयेश क्या आप कंसोल.स्सर्ट () अच्छे अभ्यास पर विस्तार कर सकते हैं, क्या आप एक उदाहरण पोस्ट कर सकते हैं?
क्रिस्टोफर फ्रांसिस्को

168

लुई का जवाब बहुत अच्छा है, लेकिन मैंने सोचा कि मैं इसे संक्षेप में प्रस्तुत करने की कोशिश करूंगा:

धमाके के संचालक ने संकलक को "नहीं नल" बाधा को अस्थायी रूप से आराम करने के लिए कहा है कि यह अन्यथा मांग कर सकता है। यह संकलक से कहता है: "डेवलपर के रूप में, मैं आपसे बेहतर जानता हूं कि यह चर अभी शून्य नहीं हो सकता है"।


85
फिर, डेवलपर के रूप में, आपने गड़बड़ कर दी है।
माइक चेम्बरलेन

9
या, संकलक के रूप में, यह गड़बड़ हो गया है। अगर कंस्ट्रक्टर किसी प्रॉपर्टी को इनिशियलाइज़ नहीं करता है लेकिन एक लाइक साइकिल हुक करता है और कंपाइलर इसे नहीं पहचानता है।
मुकुस

26
यह टीएस कंपाइलर की जिम्मेदारी नहीं है। कुछ अन्य भाषाओं के विपरीत (उदाहरण के लिए C #), JS (और इसलिए TS) यह मांग नहीं करता है कि उपयोग करने से पहले चर को आरंभ किया जाए। या, इसे दूसरे तरीके से देखने के लिए, JS में सभी वैरिएबल के साथ घोषित किए गए हैं varया letइनका प्रारंभिक रूप से उपयोग किया जा रहा है undefined। इसके अलावा, श्रेणी उदाहरण संपत्तियों को इस तरह से घोषित किया जा सकता है, इसलिए class C { constructor() { this.myVar = undefined; } }यह पूरी तरह से कानूनी है। अंत में, जीवन चक्र हुक आश्रित हैं; उदाहरण के लिए, कोणीय और प्रतिक्रिया उन्हें अलग तरीके से लागू करते हैं। इसलिए टीएस कंपाइलर से उनके बारे में तर्क की उम्मीद नहीं की जा सकती है।
माइक चेम्बरलेन

1
क्या टीएस में नियंत्रण प्रवाह आधारित प्रकार के विश्लेषण की गड़बड़ी को देखते हुए बैंग ऑपरेटर के लिए वैध उपयोग का मामला है?
यूजीन कराटेव

1
@EugeneKarataev हाँ, ढांचा अक्सर अपने भीतर चर को इनिशियलाइज़ करता है और ts कंट्रोल फ्लो विश्लेषण इसे पकड़ नहीं सकता है। इसका उपयोग निश्चित रूप से कम हो गया है, लेकिन आप ऐसे उदाहरणों में आएँगे जहाँ आपको इसकी आवश्यकता है।
arg20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.