2017-01-03 5 views
8

निम्नलिखित टाइपप्रति कोड पर विचार करें:टाइपस्क्रिप्ट मुझे गैर-शून्य assertion ऑपरेटर के अनावश्यक उपयोग के बारे में चेतावनी दे सकता है?

let x = { foo: { bar: "baz" } }; 
console.log(x.foo!.bar); 

यहाँ, x.foo की अनुमानित प्रकार { bar: string } है, और इसलिए गैर-शून्य अभिकथन ऑपरेटर ! के उपयोग (देखें उदाहरण के लिए https://github.com/Microsoft/TypeScript/issues/7395) के लिए कोई जरूरत नहीं है: संकलक पहले से ही जानता है कि x.foo शून्य नहीं हो सकता है।

क्या टीसी (या संभवतः व्यापक रूप से उपयोग किए जाने वाले तीसरे पक्ष के उपकरण जैसे टीएसलिंट) मुझे ! के इन आवश्यक उपयोगों के बारे में चेतावनी दे सकता है, और/या यह एक योजनाबद्ध सुविधा है?

मुझे यकीन है कि इस सिद्धांत में संभव है कर रहा हूँ (जैसे this'd सिर्फ टाइपप्रति संकलक एपीआई का उपयोग स्थानों पर जहां ! चर जिसका प्रकार पर प्रयोग किया जाता है की पहचान करने की बात हो लगता है T | null या T | undefined नहीं है); मैं बस सोच रहा हूं कि भारी उठाना पहले ही हो चुका है या नहीं। या, मुझे लगता है कि टाइपस्क्रिप्ट कंपाइलर एपीआई के प्रासंगिक हिस्सों में एक सूचक भी काम करेगा - इसके लिए दस्तावेज ढूंढना मुश्किल है (मुझे लगता है क्योंकि यह अभी तक स्थिर नहीं है)।

(कारण मैं पूछ है कि मैं चिंतित हूं कि मैं कोड से निपटने के लिए होने अंत करने जा रहा हूँ कर रहा हूँ जहाँ मुझे पिछले कुछ बेवकूफ हर जगह ! छिड़का tsc --strictNullChecks रोक त्रुटियों जारी करने, वास्तव में है कि क्या के बारे में सोच के बिना बनाने के लिए जोरदार चर वास्तव में रनटाइम पर गैर-शून्य हो जाएगा। अगर यह रनटाइम पर शून्य हो जाता है, वॉयला! एक बग जिसे हम संकलित समय पर पकड़े गए थे, लेकिन अतिरंजित ! की वजह से नहीं था। ! की उपस्थिति गैर-शून्य होने के लिए पहले से ज्ञात चर पर यह दृढ़ता से संकेत देता है कि कोड ! पर अधिक गलत तरीके से उपयोग कर रहा है।)

+0

दिलचस्प। मुझे नहीं पता था कि यह ऑपरेटर भी अस्तित्व में था। –

+0

असल में, ऐसा करने से आपको कुछ भी नहीं रोक रहा है: x.foo.bar = null; x.foo = null ;, इस तथ्य के बावजूद कि x का प्रकार {bar: string} है – vintem

उत्तर

0

नहीं, ऐसा लगता है कि वर्तमान में ऐसा नहीं हो सकता है। strictNullChecks :)

सक्षम करने के लिए याद रखें - https://github.com/Sheeo/TypeScript/commit/e6d1651e4d28493b6e5f20d027ad8e86f7451552

आप रेपो क्लोनिंग और संकलक के उस संस्करण का उपयोग करके इसे चला सकते हैं: संकलक codebase में हो रही के हित में, मैं इसे अपने कांटा यहां पर ऐसा बनाया

संबंधित मुद्दे

 संबंधित मुद्दे