यह ECMAScript वैकल्पिक चाइनिंग विनिर्देश में परिभाषित किया गया है, इसलिए जब हम इस पर चर्चा करते हैं , तो हमें संभवतः वैकल्पिक श्रृंखलन का उल्लेख करना चाहिए । संभवतः कार्यान्वयन:
const result = a?.b?.c;
इसका एक लंबा और छोटा पहलू यह है कि टाइपस्क्रिप्ट टीम ECMAScript विनिर्देश की प्रतीक्षा कर रही है ताकि वे और अधिक सख्त हो सकें, इसलिए उनका कार्यान्वयन भविष्य में गैर-ब्रेकिंग हो सकता है। अगर वे अब कुछ लागू करते हैं, तो ईसीएमएस्क्रिप्ट को उनके विनिर्देश को फिर से परिभाषित करने पर बड़े बदलावों की आवश्यकता होगी।
देख वैकल्पिक चैनिंग विशिष्टता
जहाँ कुछ भी कभी भी मानक जावास्क्रिप्ट नहीं होता है, टाइपस्क्रिप्ट टीम उन्हें फिट होने के रूप में लागू कर सकती है, लेकिन भविष्य के ECMAScript परिवर्धन के लिए, वे शब्दार्थों को संरक्षित करना चाहते हैं, भले ही वे जल्दी पहुंच दें, क्योंकि उनके पास कई अन्य विशेषताओं के लिए है।
शॉर्ट कट्स
तो सभी JavaScripts फंकी ऑपरेटर्स उपलब्ध हैं, जिसमें टाइप रूपांतरण जैसे ...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
मैनुअल समाधान
लेकिन सवाल पर वापस। मेरे पास एक उदाहरण है कि आप जावास्क्रिप्ट में एक समान काम कैसे कर सकते हैं (और इसलिए टाइपस्क्रिप्ट) हालांकि मैं निश्चित रूप से यह सुझाव नहीं दे रहा हूं कि यह एक सुशोभित है जैसा कि आप वास्तव में हैं।
(foo||{}).bar;
तो अगर foo
है undefined
परिणाम है undefined
और यदि foo
परिभाषित और है एक संपत्ति नामितbar
एक मूल्य होता है, नतीजा यह है कि मूल्य है।
मैंने JSFiddle पर एक उदाहरण दिया ।
यह लंबे उदाहरणों के लिए काफी स्केच दिखता है।
var postCode = ((person||{}).address||{}).postcode;
श्रृंखला समारोह
यदि आप छोटे संस्करण के लिए बेताब हैं, जबकि विनिर्देश अभी भी हवा में है, तो मैं कुछ मामलों में इस पद्धति का उपयोग करता हूं। यह अभिव्यक्ति का मूल्यांकन करता है और एक डिफ़ॉल्ट लौटाता है यदि श्रृंखला संतुष्ट नहीं हो सकती है या अशक्त / अपरिभाषित हो सकती है (ध्यान दें कि !=
यहां महत्वपूर्ण है, हम उपयोग नहीं करना चाहते हैं !==
क्योंकि हम यहां सकारात्मक सकारात्मकता चाहते हैं)।
function chain<T>(exp: () => T, d: T) {
try {
let val = exp();
if (val != null) {
return val;
}
} catch { }
return d;
}
let obj1: { a?: { b?: string }} = {
a: {
b: 'c'
}
};
// 'c'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {
a: {}
};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = null;
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));