javascript - क्यों `.कैच(इरेट=>कंसोल.रोर(इरेट))` हतोत्साहित है?




node.js promise try-catch (5)

return ….catch(err => console.error(err)) क्या गलत है return ….catch(err => console.error(err)) ?

यह वादा करता है कि आप त्रुटि को संभालने के बाद undefined साथ पूरा करेंगे।

यह स्वयं है, त्रुटियों को पकड़ना और उन्हें लॉग इन करना एक वादा श्रृंखला के अंत में ठीक है:

function main() {
    const element = document.getElementById("output");
    getStuff().then(result => {
        element.textContent = result;
    }, error => {
        element.textContent = "Sorry";
        element.classList.add("error");
        console.error(error);
    });
    element.textContent = "Fetching…";
}

हालाँकि अगर getStuff() इसे लॉग इन करने के लिए त्रुटि को पकड़ता है और इसे संभालने के लिए और कुछ नहीं करता है जैसे कि एक समझदार वापसी परिणाम प्रदान करता है, तो यह " क्षमा करें " के बजाय पृष्ठ में undefined देता है।

मैंने बहुत सारे कोड देखे हैं जो ऐसा करता है, क्यों?

ऐतिहासिक रूप से, लोग वादे की त्रुटियों से डरते थे जो कहीं भी नहीं होते थे, जिससे वे पूरी तरह से गायब हो जाते हैं - वादे से "निगल लिया" जा रहा है। इसलिए उन्होंने यह सुनिश्चित करने के लिए कि वे कंसोल में त्रुटियों को नोटिस करेंगे, प्रत्येक फ़ंक्शन में .catch(console.error) जोड़ा।

यह अब आवश्यक नहीं है क्योंकि सभी आधुनिक वादा कार्यान्वयन अखंडित वादों को खारिज कर सकते हैं और कंसोल पर आग की चेतावनी देंगे।

बेशक यह अभी भी आवश्यक है (या कम से कम अच्छा अभ्यास, भले ही आप कुछ भी विफल होने की उम्मीद न करें) वादा श्रृंखला के अंत में त्रुटियों को पकड़ने के लिए (जब आप आगे कोई वादा वापस नहीं करते हैं)।

इसके बजाय मुझे क्या करना चाहिए?

फ़ंक्शंस में जो अपने कॉलर को एक वादा return करते हैं, त्रुटियों को लॉग न करें और ऐसा करके उन्हें निगल लें। बस वादा वापस करें ताकि कॉल करने वाला अस्वीकृति को पकड़ सके और त्रुटि को उचित तरीके से (लॉगिंग या कुछ भी करके) संभाल सके।

यह कोड को बहुत सरल बनाता है:

function getStuff() { 
  return fetchStuff().then(stuff => process(stuff));
}

async function getStuff() { 
  const stuff = await fetchStuff();
  return process(stuff);
}

यदि आप अस्वीकृति के कारण (लॉगिंग जानकारी में संशोधन) के साथ कुछ करने पर जोर देते हैं, तो त्रुटि को फिर से फेंकना सुनिश्चित करें:

function getStuff() { 
  return fetchStuff().then(stuff =>
    process(stuff)
  ).catch(error => {
    stuffDetails.log(error);
    throw new Error("something happened, see detail log");
  });
}

async function getStuff() {
  try {
    const stuff = await fetchStuff();
    return process(stuff);
  } catch(error) {
    stuffDetails.log(error);
    throw new Error("something happened, see detail log");
  }
}

यदि आप कुछ त्रुटियों को संभाल रहे हैं तो वही करें:

function getStuff() { 
  return fetchStuff().then(stuff =>
    process(stuff)
  ).catch(error => {
    if (expected(error))
      return defaultStuff;
    else
      throw error;
  });
}

async function getStuff() {
  try {
    const stuff = await fetchStuff();
    return process(stuff);
  } catch(error) {
    if (expected(error))
      return defaultStuff;
    else
      throw error;
  }
}

मैं वादों का उपयोग कर रहा हूं और कोड है जो निम्नलिखित की तरह दिखता है:

function getStuff() { 
  return fetchStuff().then(stuff => 
    process(stuff)
  ).catch(err => {
    console.error(err);
  });
}

या:

async function getStuff() { 
  try {
    const stuff = await fetchStuff();
    return process(stuff);
  } catch (err) { 
    console.error(err);
  }
}

मैं त्रुटियों को याद करने से बचने के लिए ऐसा कर रहा था, लेकिन एक साथी उपयोगकर्ता द्वारा कहा गया था कि मुझे ऐसा नहीं करना चाहिए और यह बहुत कम है।

  • return ….catch(err => console.error(err)) क्या गलत है return ….catch(err => console.error(err)) ?
  • मैंने बहुत सारे कोड देखे हैं जो ऐसा करता है, क्यों?
  • इसके बजाय मुझे क्या करना चाहिए?

पुराना कोड ऐसा क्यों करता है?

ऐतिहासिक रूप से, पुराने (पूर्व 2013) वादों के पुस्तकालयों को बिना सोचे-समझे दिए गए वादों को आपने खुद नहीं संभाला। तब से लिखी गई किसी भी बात में ऐसा नहीं है।

आज क्या होता है?

ब्राउज़र और नोड.जे. पहले से ही स्वचालित रूप से अनकहा वादा अस्वीकारों को लॉग इन करते हैं या उन्हें संभालने के लिए व्यवहार करते हैं और उन्हें स्वचालित रूप से लॉग इन करेंगे।

इसके अलावा - .catch को जोड़कर आप उस .catch को .catch कर रहे हैं जो फ़ंक्शन को undefined .catch है:

// undefined if there was an error
getStuff().then(stuff => console.log(stuff)); 

प्रश्न यह है कि async कोड लिखते समय किसी को अपने आप से पूछना चाहिए "आमतौर पर कोड का तुल्यकालिक संस्करण क्या होगा?":

function calculate() { 
  try {
    const stuff = generateStuff();
    return process(stuff);
  } catch (err) { 
    console.error(err);
    // now it's clear that this function is 'swallowing' the error.
  }
}

मुझे नहीं लगता कि यदि कोई त्रुटि होती है तो एक उपभोक्ता इस फ़ंक्शन को undefined वापस करने की उम्मीद करेगा।

तो चीजों को योग करने के लिए - यह पर आधारित है क्योंकि यह एप्लिकेशन प्रवाह में ब्राउज़रों को आश्चर्यचकित करता है और ब्राउज़रों ने आज भी बिना किसी वादा किए त्रुटियों को लॉग किया।

इसके बजाय क्या करें:

कुछ भी तो नहीं। यही इसकी खूबसूरती है - अगर आपने लिखा है:

async function getStuff() { 
  const stuff = await fetchStuff();
  return process(stuff);
}
// or without async/await
const getStuff = fetchStuff().then(process);

पहली जगह में आपको वैसे भी चारों ओर बेहतर त्रुटियां मिलेंगी :)

यदि मैं Node.js का पुराना संस्करण चला रहा हूं तो मुझे क्या करना चाहिए?

Node.js के पुराने संस्करण त्रुटियों को लॉग नहीं कर सकते हैं या एक डिप्रेसेशन चेतावनी दिखा सकते हैं। उन संस्करणों में आप विश्व स्तर पर console.error (या उचित लॉगिंग इंस्ट्रूमेंटेशन) का उपयोग कर सकते हैं:

// or throw to stop on errors
process.on('unhandledRejection', e => console.error(e));

यहां सबसे सामान्य कथन, जो कि जावास्क्रिप्ट से परे की भाषाओं में लागू होता है, जब तक आप त्रुटि को ' हैंडल ' करने की योजना नहीं बनाते हैं, तब तक यह ' कैच ' नहीं है। लॉगिंग संभाल नहीं रहा है।

यानी सामान्य तौर पर, एक पकड़ने के लिए सबसे अच्छा (केवल?) कारण एक रचनात्मक तरीके से त्रुटि से निपटने के लिए / 'सौदा' है जो बिना किसी और समस्या के कोड को ले जाने की अनुमति देता है। और फिर, लॉगिंग की एक पंक्ति शायद कभी नहीं प्राप्त होती है कि ...


कारण जब तक आपको बिल्कुल आवश्यक न हो (जो कभी नहीं है) त्रुटियों को नहीं catch चाहिए

वादे को अस्वीकार करने के अलावा, हैंडलर पकड़ने से जेएस त्रुटियों को भी निगल जाता है जो कि संबंधित सफलता हैंडलर द्वारा चलाए गए किसी भी क्रमिक कोड में होता है।

निहितार्थ

  1. एक बार एक catch हैंडलर द्वारा किसी त्रुटि को पकड़ लिया जाता है, इसे माना जाता है और हैंडल किया जाता है। वादे की श्रृंखला में सभी उत्तराधिकारी प्रतिज्ञा सदस्य असफल होने के बजाय अपने सफल हैंडलर को बुलाएंगे या हैंडलर को पकड़ेंगे। इससे अजीब व्यवहार होता है। यह कभी भी इच्छित कोड प्रवाह नहीं है।

  2. यदि सेवा पद्धति ( getStuff ) की तरह निचले स्तर पर कोई फ़ंक्शन catch में त्रुटियों को हैंडल करता है, तो यह सेपरेशन ऑफ़ getStuff के सिद्धांत को तोड़ देता है। डेटा को लाने के लिए सर्विस हैंडलर की एक ज़िम्मेदारी पूरी तरह से होनी चाहिए। जब वह डेटा कॉल विफल हो जाता है, तो उस सेवा हैंडलर को कॉल करने वाले एप्लिकेशन को त्रुटि का प्रबंधन करना चाहिए।

  3. किसी फ़ंक्शन में त्रुटि को पकड़ने से एक दूसरे को पकड़ा जा रहा है, जिसके परिणामस्वरूप चारों ओर अजीब व्यवहार होता है और यह बग के मूल कारणों को ट्रैक करना वास्तव में कठिन बनाता है। इस तरह के कीड़ों को ट्रैक करने के लिए हमें क्रोम देव कंसोल में Break on Caught Exceptions को सक्षम करना होगा जो हर catch पर टूटेगा और डिबग के अंत में घंटों लग सकता है।

वादों को अस्वीकार करने के लिए हमेशा एक अच्छा अभ्यास है लेकिन हमें हमेशा ऐसा करना चाहिए कि catch हैंडलर के ऊपर failure हैंडलर का उपयोग किया जाए। एक विफलता हैंडलर केवल Promise rejections पकड़ लेगा और यदि कोई जेएस त्रुटि होती है, तो यह कैसे होता है, आवेदन को टूटने देता है।


हालांकि स्वीकृत उत्तर ठीक है, मुझे लगा कि यह वास्तव में इस बिंदु पर टाइपस्क्रिप्ट न्याय नहीं करता है। यह अब शुरुआती दिनों नहीं है। TypeScript में लिखे जाने वाले कई लोकप्रिय ढांचे के साथ टाइपस्क्रिप्ट अब बहुत अधिक गोद ले रहा है। जावास्क्रिप्ट के बजाय टाइपस्क्रिप्ट चुनने के कारण अब बहुत से हैं।

जावास्क्रिप्ट से संबंध

जावास्क्रिप्ट ईसीएमएस्क्रिप्ट मानकों के माध्यम से मानकीकृत है। उपयोग में आने वाले सभी ब्राउज़र नए ईसीएमएस्क्रिप्ट मानकों की सभी सुविधाओं का समर्थन नहीं करते हैं (इस table देखें)। टाइपस्क्रिप्ट नए ईसीएमएस्क्रिप्ट मानकों का समर्थन करता है और उन्हें आपके चयन के (पुराने) ईसीएमएस्क्रिप्ट लक्ष्य (वर्तमान लक्ष्य 3, 5 और 6 [उर्फ 2015]) को संकलित करता है। इसका मतलब है कि आप ES2015 और उससे परे की सुविधाओं का उपयोग कर सकते हैं, जैसे मॉड्यूल, लैम्ब्डा फ़ंक्शंस, क्लासेस, स्प्रेड ऑपरेटर, विनाशकारी, आज। यह पाठ्यक्रम के प्रकार का समर्थन भी जोड़ता है, जो किसी भी ईसीएमएस्क्रिप्ट मानक का हिस्सा नहीं है और संभवतः जावास्क्रिप्ट की संकलित प्रकृति की बजाय व्याख्या की गई प्रकृति के कारण कभी नहीं हो सकता है। टाइपस्क्रिप्ट की प्रकार प्रणाली अपेक्षाकृत समृद्ध है और इसमें शामिल हैं: इंटरफेस, एनम्स, हाइब्रिड प्रकार, जेनेरिक, यूनियन और चौराहे के प्रकार, एक्सेस संशोधक और बहुत कुछ। टाइपस्क्रिप्ट की आधिकारिक वेबसाइट इन सुविधाओं का एक सिंहावलोकन देता है।

अन्य जावास्क्रिप्ट लक्ष्यीकरण भाषाओं से संबंध

टाइपस्क्रिप्ट में जावास्क्रिप्ट को संकलित करने वाली अन्य भाषाओं की तुलना में एक अद्वितीय दर्शन है। जावास्क्रिप्ट कोड मान्य टाइपस्क्रिप्ट कोड है; टाइपस्क्रिप्ट जावास्क्रिप्ट का एक सुपरसेट है। आप अपने .js फ़ाइलों को .ts फ़ाइलों में लगभग बदल सकते हैं और टाइपस्क्रिप्ट का उपयोग शुरू कर सकते हैं। टाइपस्क्रिप्ट फ़ाइलों को पठनीय जावास्क्रिप्ट में संकलित किया जाता है, ताकि माइग्रेशन वापस संभव हो और संकलित टाइपस्क्रिप्ट को समझना मुश्किल नहीं है। इस प्रकार टाइपस्क्रिप्ट अपनी कमजोरियों में सुधार करते समय जावास्क्रिप्ट की सफलताओं पर बनाता है।

एक तरफ, आपके पास भविष्य के सबूत उपकरण हैं जो आधुनिक ईसीएमएस्क्रिप्ट मानकों को लेते हैं और इसे पुराने जावास्क्रिप्ट संस्करणों में संकलित करते हैं, जिसमें बेबेल सबसे लोकप्रिय है। दूसरी तरफ, आपके पास ऐसी भाषाएं हैं जो जावास्क्रिप्ट को पूरी तरह से भिन्न कर सकती हैं जो जावास्क्रिप्ट को लक्षित करती है, जैसे कॉफ़ीस्क्रिप्ट, क्लोजर, डार्ट, एल्म, हक्स, स्कैलाज, और एक संपूर्ण होस्ट अधिक (इस list देखें)। ये भाषाएं, हालांकि वे जावास्क्रिप्ट के भविष्य के नेतृत्व में कहीं बेहतर हो सकती हैं, उनके वायदा के लिए पर्याप्त गोद लेने की पर्याप्त जोखिम नहीं है। इन भाषाओं में से कुछ के लिए अनुभवी डेवलपर्स को खोजने में आपको और भी परेशानी हो सकती है, हालांकि जो लोग आप पाएंगे वे अक्सर अधिक उत्साही हो सकते हैं। जावास्क्रिप्ट के साथ इंटरऑप थोड़ा और भी शामिल हो सकता है, क्योंकि वे वास्तव में जावास्क्रिप्ट से क्या हटाए जाते हैं।

टाइपस्क्रिप्ट इन दो चरम सीमाओं के बीच में बैठता है, इस प्रकार जोखिम को संतुलित करता है। टाइपस्क्रिप्ट किसी भी मानक द्वारा जोखिम भरा विकल्प नहीं है। यदि आप जावास्क्रिप्ट से परिचित हैं, तो इसका उपयोग करने में बहुत कम प्रयास होता है, क्योंकि यह पूरी तरह से अलग भाषा नहीं है, इसमें उत्कृष्ट जावास्क्रिप्ट इंटरऑपरेबिलिटी सपोर्ट है और हाल ही में इसमें बहुत सारे गोद लेने को देखा गया है।

वैकल्पिक रूप से स्थिर टाइपिंग और प्रकार अनुमान

जावास्क्रिप्ट गतिशील रूप से टाइप किया गया है। इसका अर्थ यह है कि जावास्क्रिप्ट को पता नहीं है कि एक चर का प्रकार तब तक है जब तक कि यह वास्तव में रन-टाइम पर तत्काल नहीं होता है। इसका मतलब यह भी है कि यह बहुत देर हो सकती है। टाइपस्क्रिप्ट जावास्क्रिप्ट में टाइप समर्थन जोड़ता है। यदि आप अपने कार्ड सही तरीके से खेलते हैं तो कुछ निश्चित चर के कुछ चर के झूठी धारणाओं के कारण होने वाली बग पूरी तरह उन्मूलन की जा सकती है; आप अपना कोड कितना सख्त टाइप करते हैं या यदि आप अपना कोड टाइप करते हैं तो आप पर निर्भर है।

टाइपस्क्रिप्ट टाइपिंग अनुमान के उपयोग से थोड़ा आसान टाइपिंग और बहुत कम स्पष्ट बनाता है। उदाहरण के लिए: टाइपस्क्रिप्ट में var x = "hello" var x : string = "hello" जैसा ही है। इस प्रकार का उपयोग बस इसके उपयोग से अनुमानित है। यहां तक ​​कि आप स्पष्ट रूप से प्रकारों को टाइप नहीं करते हैं, फिर भी वे आपको कुछ ऐसा करने से बचाने के लिए हैं जो अन्यथा रन-टाइम त्रुटि के परिणामस्वरूप होगा।

टाइपस्क्रिप्ट को वैकल्पिक रूप से डिफ़ॉल्ट रूप से टाइप किया जाता है। उदाहरण के लिए function divideByTwo(x) { return x / 2 } टाइपस्क्रिप्ट में एक वैध फ़ंक्शन है जिसे किसी भी प्रकार के पैरामीटर के साथ बुलाया जा सकता है, भले ही इसे स्ट्रिंग के साथ कॉल करना निश्चित रूप से रनटाइम त्रुटि में परिणाम देगा। जैसे आप जावास्क्रिप्ट में उपयोग किया जाता है। यह काम करता है, क्योंकि जब किसी प्रकार को स्पष्ट रूप से असाइन नहीं किया गया था और प्रकार का अनुमान नहीं लगाया जा सकता था, जैसे विभाजन में दो उदाहरण, टाइपस्क्रिप्ट निश्चित रूप से any प्रकार को असाइन करेगा। इसका मतलब है कि divideByTwo फ़ंक्शन का प्रकार हस्ताक्षर स्वचालित रूप से function divideByTwo(x : any) : any हो जाता function divideByTwo(x : any) : any । इस व्यवहार को अस्वीकार करने के लिए एक कंपाइलर ध्वज है: --noImplicitAny । इस ध्वज को सक्षम करने से आपको अधिक सुरक्षा मिलती है, लेकिन इसका मतलब यह भी है कि आपको अधिक टाइपिंग करना होगा।

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

यह ध्यान रखना दिलचस्प है कि यह वही पेपर पाता है कि टाइपस्क्रिप्ट कम त्रुटि प्रवण है तो जावास्क्रिप्ट:

सकारात्मक गुणांक वाले लोगों के लिए हम उम्मीद कर सकते हैं कि भाषा, कैटरिस परिभ्रमण, दोष संख्याओं की एक बड़ी संख्या से जुड़ी है। इन भाषाओं में सी, सी ++, जावास्क्रिप्ट , ऑब्जेक्टिव-सी, पीएचपी और पायथन शामिल हैं। क्लोजर , हास्केल, रुबी, स्कैला और टाइपस्क्रिप्ट भाषाएं सभी में ऋणात्मक गुणांक हैं जो यह दर्शाते हैं कि इन भाषाओं में औसत की तुलना में कम होने की संभावना कम होती है।

उन्नत आईडीई समर्थन

टाइपस्क्रिप्ट के साथ विकास अनुभव जावास्क्रिप्ट पर एक बड़ा सुधार है। आईडीईई को रीयल-टाइम में टाइपस्क्रिप्ट कंपाइलर द्वारा समृद्ध प्रकार की जानकारी पर सूचित किया जाता है। यह कुछ प्रमुख फायदे देता है। उदाहरण के लिए, टाइपस्क्रिप्ट के साथ आप सुरक्षित रूप से अपने संपूर्ण कोडबेस में नामों जैसे रीफैक्टरिंग कर सकते हैं। कोड पूर्ण होने के माध्यम से आप लाइब्रेरी द्वारा प्रदान किए जाने वाले कार्यों पर इनलाइन सहायता प्राप्त कर सकते हैं। उन्हें याद रखने या उन्हें ऑनलाइन संदर्भों में देखने की आवश्यकता नहीं है। व्यस्त कोडिंग करते समय संकलन त्रुटियों को सीधे लाल रंग की रेखा के साथ आईडीई में रिपोर्ट किया जाता है। यह सब जावास्क्रिप्ट के साथ काम करने की तुलना में उत्पादकता में महत्वपूर्ण लाभ के लिए अनुमति देता है। कोई भी कोडिंग और कम समय डीबगिंग करने में अधिक समय व्यतीत कर सकता है।

आईडीई की एक विस्तृत श्रृंखला है जिसमें टाइपस्क्रिप्ट के लिए उत्कृष्ट समर्थन है, जैसे विजुअल स्टूडियो और वीएस कोड, एटम, सब्लिम, और इंटेलिजे / वेबस्टॉर्म।

सख्त नल चेक

फॉर्म की रनटाइम त्रुटियां cannot read property 'x' of undefined या undefined is not a function cannot read property 'x' of undefined undefined is not a function सामान्य रूप से जावास्क्रिप्ट कोड में बग के कारण नहीं होता है। बॉक्स के बाहर टाइपस्क्रिप्ट पहले से ही इस तरह की त्रुटियों की संभावना को कम कर देता है, क्योंकि कोई एक चर का उपयोग नहीं कर सकता है जो टाइपस्क्रिप्ट कंपाइलर ( any टाइप किए गए चर के गुणों के अपवाद के साथ) के लिए ज्ञात नहीं है। यह अभी भी संभव है हालांकि गलती से एक वेरिएबल का उपयोग करें जो undefined सेट है। हालांकि, टाइपस्क्रिप्ट के 2.0 संस्करण के साथ आप गैर-शून्य प्रकारों के उपयोग के माध्यम से इन प्रकार की त्रुटियों को एक साथ समाप्त कर सकते हैं। यह निम्नानुसार काम करता है:

सख्त नल चेक सक्षम ( --strictNullChecks संकलक ध्वज) के साथ टाइपस्क्रिप्ट कंपाइलर एक चर के लिए undefined होने की अनुमति नहीं देगा जबतक कि आप स्पष्ट रूप से इसे शून्य प्रकार के घोषित नहीं करते हैं। उदाहरण के लिए, let x : number = undefined परिणामस्वरूप संकलन त्रुटि होगी। यह टाइप सिद्धांत के साथ पूरी तरह से फिट बैठता है, क्योंकि undefined एक संख्या नहीं है। कोई x को एक प्रकार का number होने के लिए परिभाषित कर सकता है और इसे ठीक करने के लिए undefined : let x : number | undefined = undefined let x : number | undefined = undefined

एक बार एक प्रकार को शून्य के रूप में जाना जाता है, जिसका अर्थ है कि यह एक प्रकार का है जो मूल्य null या undefined , टाइपस्क्रिप्ट कंपाइलर नियंत्रण प्रवाह आधारित प्रकार विश्लेषण के माध्यम से निर्धारित कर सकता है कि आपका कोड सुरक्षित रूप से एक चर का उपयोग कर सकता है या नहीं। दूसरे शब्दों में जब आप एक चर की जांच करते हैं तो उदाहरण के लिए undefined होता है उदाहरण के लिए if एक कथन स्टेटस्क्रिप्ट कंपाइलर अनुमान लगाएगा कि आपके कोड के नियंत्रण प्रवाह की उस शाखा में टाइप अब और शून्य नहीं है और इसलिए सुरक्षित रूप से उपयोग किया जा सकता है। ये रहा एक सरल उदाहरण:

let x: number | undefined;
if (x !== undefined) x += 1; // this line will compile, because x is checked.
x += 1; // this line will fail compilation, because x might be undefined.

बिल्डस्क्रिप्ट एंडर्स हेजल्सबर्ग के 2016 सम्मेलन सह-डिजाइनर के निर्माण के दौरान इस सुविधा का एक विस्तृत स्पष्टीकरण और प्रदर्शन दिया गया: video (44:30 से 56:30 तक)।

संकलन

टाइपस्क्रिप्ट का उपयोग करने के लिए आपको जावास्क्रिप्ट कोड को संकलित करने के लिए एक बिल्ड प्रक्रिया की आवश्यकता है। निर्माण प्रक्रिया में आमतौर पर आपके प्रोजेक्ट के आकार के आधार पर केवल कुछ सेकंड लगते हैं। टाइपस्क्रिप्ट कंपाइलर वृद्धिशील संकलन ( --watch कंपाइलर ध्वज) का समर्थन करता है, ताकि सभी बाद के परिवर्तनों को अधिक गति से संकलित किया जा सके।

टाइपस्क्रिप्ट कंपाइलर उत्पन्न .js फ़ाइलों में स्रोत मानचित्र जानकारी को इनलाइन कर सकता है या अलग .map फ़ाइलों को बना सकता है। स्रोत मानचित्र जानकारी का प्रयोग क्रोम देवटूल और अन्य आईडीई जैसे डीबगिंग यूटिलिटीज द्वारा जावास्क्रिप्ट में लाइनों को टाइपस्क्रिप्ट में जेनरेट करने के लिए किया जा सकता है। यह आपके लिए अपने टाइपस्क्रिप्ट कोड पर सीधे रनटाइम के दौरान ब्रेकपॉइंट्स सेट करने और चर का निरीक्षण करने के लिए संभव बनाता है। स्रोत मानचित्र जानकारी बहुत अच्छी तरह से काम करती है, यह टाइपस्क्रिप्ट से काफी पहले थी, लेकिन डिस्गिंग टाइपस्क्रिप्ट आम तौर पर जावास्क्रिप्ट का उपयोग करते समय उतना ही महान नहीं है। उदाहरण के लिए this कीवर्ड को ले लो। ES2015 के बाद this कीवर्ड के बंद किए गए अर्थशास्त्र के कारण, this वास्तव में रनटाइम के दौरान _this नामक चर के रूप में मौजूद हो सकता है ( यह उत्तर देखें)। यह आपको डिबगिंग के दौरान भ्रमित कर सकता है, लेकिन यदि आप इसके बारे में जानते हैं या जावास्क्रिप्ट कोड का निरीक्षण करते हैं तो आम तौर पर कोई समस्या नहीं है। यह ध्यान दिया जाना चाहिए कि बेबेल को एक ही तरह की समस्या का सामना करना पड़ता है।

टाइपस्क्रिप्ट कंपाइलर कुछ अन्य चालें कर सकते हैं, जैसे decorators के आधार पर इंटरसेप्टिंग कोड उत्पन्न करना, विभिन्न मॉड्यूल सिस्टम के लिए मॉड्यूल लोडिंग कोड उत्पन्न करना और जेएसएक्स को पार्स करना। हालांकि, आपको टाइपस्क्रिप्ट कंपाइलर के अलावा एक बिल्ड टूल की आवश्यकता होगी। उदाहरण के लिए यदि आप अपने कोड को संपीड़ित करना चाहते हैं तो आपको ऐसा करने के लिए अपनी बिल्ड प्रक्रिया में अन्य टूल जोड़ना होगा।

वेबपैक, Gulp , ग्रंट के लिए टाइपस्क्रिप्ट संकलन प्लगइन्स उपलब्ध हैं और वहां कहीं भी कोई अन्य जावास्क्रिप्ट निर्माण उपकरण उपलब्ध है। टाइपस्क्रिप्ट दस्तावेज़ में सभी को कवर करने वाले निर्माण टूल के साथ एकीकृत करने पर एक अनुभाग है। यदि आप और अधिक समय की जांच करना चाहते हैं तो एक linter भी उपलब्ध है। वहां बड़ी संख्या में बीज परियोजनाएं भी हैं जो आपको टाइपस्क्रिप्ट के साथ संयोजन में शुरू करेंगी जैसे कि एंगुलर 2, रिएक्ट, एम्बर, सिस्टमजे, वेबपैक, गुलप इत्यादि जैसी अन्य तकनीकों के समूह के साथ।

जावास्क्रिप्ट इंटरऑपरेबिलिटी

चूंकि टाइपस्क्रिप्ट जावास्क्रिप्ट से बहुत करीबी से संबंधित है, इसकी बड़ी इंटरऑपरेबिलिटी क्षमताएं हैं, लेकिन टाइपस्क्रिप्ट में जावास्क्रिप्ट पुस्तकालयों के साथ काम करने के लिए कुछ अतिरिक्त काम की आवश्यकता है। टाइपस्क्रिप्ट परिभाषाओं की आवश्यकता है ताकि टाइपस्क्रिप्ट कंपाइलर समझ सके कि _.groupBy या angular.copy या $.fadeOut जैसे फ़ंक्शन कॉल वास्तव में अवैध कथन नहीं हैं। इन कार्यों के लिए परिभाषाओं को .d.ts फ़ाइलों में रखा गया है।

किसी परिभाषा को किसी भी तरीके से उपयोग करने की अनुमति देने के लिए एक परिभाषा सबसे सरल रूप ले सकती है। उदाहरण के लिए, Lodash का उपयोग करते Lodash , एक पंक्ति परिभाषा फ़ाइल declare var _ : any आपको किसी भी फ़ंक्शन को कॉल करने की अनुमति देगा, लेकिन फिर भी आप अभी भी गलतियां करने में सक्षम हैं: _.foobar() एक होगा कानूनी टाइपस्क्रिप्ट कॉल, लेकिन निश्चित रूप से रन-टाइम पर एक अवैध कॉल है। यदि आप उचित प्रकार का समर्थन और कोड पूरा करना चाहते हैं तो आपकी परिभाषा फ़ाइल को और सटीक होना चाहिए (उदाहरण के लिए लॉसश परिभाषाएं देखें)।

एनपीएम मॉड्यूल जो स्वयं की टाइप परिभाषाओं के साथ प्री-पैक किए जाते हैं उन्हें टाइपस्क्रिप्ट कंपाइलर ( documentation देखें) द्वारा स्वचालित रूप से समझा जाता है। किसी भी अन्य अर्ध-लोकप्रिय जावास्क्रिप्ट लाइब्रेरी के लिए जिसमें अपनी परिभाषा शामिल नहीं है, वहां किसी ने पहले से ही किसी अन्य एनपीएम मॉड्यूल के माध्यम से टाइप परिभाषाएं उपलब्ध कराई हैं। ये मॉड्यूल "@ प्रकार /" के साथ उपसर्ग किए गए हैं और एक DefinitelyTyped से परिभाषित गीथब रिपोजिटरी से आते हैं जिन्हें परिभाषित किया जाता है।

एक चेतावनी है: टाइप परिभाषाओं को उस लाइब्रेरी के संस्करण से मेल खाना चाहिए जो आप रन-टाइम पर उपयोग कर रहे हैं। यदि वे नहीं करते हैं, तो टाइपस्क्रिप्ट आपको फ़ंक्शन को कॉल करने या किसी चर को संदर्भित करने से अस्वीकार कर सकता है जो आपको मौजूद है या किसी फ़ंक्शन को कॉल करने की अनुमति देता है या एक चर को संदर्भित करता है जो अस्तित्व में नहीं है, केवल इसलिए कि प्रकार संकलन-समय पर रन-टाइम से मेल नहीं खाते हैं । तो सुनिश्चित करें कि आप जिस लाइब्रेरी का उपयोग कर रहे हैं उसके सही संस्करण के लिए टाइप परिभाषाओं का सही संस्करण लोड करें।

ईमानदार होने के लिए, इसमें थोड़ी परेशानी होती है और यह उन कारणों में से एक हो सकता है जिन्हें आप टाइपस्क्रिप्ट नहीं चुनते हैं, बल्कि इसके बजाय बैबेल जैसी कुछ चीज़ों के लिए जाते हैं जो टाइप परिभाषाएं प्राप्त करने से ग्रस्त नहीं हैं। दूसरी तरफ, यदि आप जानते हैं कि आप क्या कर रहे हैं तो आप गलत या अनुपलब्ध परिभाषा फ़ाइलों के कारण किसी भी तरह के मुद्दों को आसानी से दूर कर सकते हैं।

जावास्क्रिप्ट से टाइपस्क्रिप्ट में कनवर्ट करना

किसी भी .js फ़ाइल का नाम बदलकर एक .ts तक किया जा सकता है और आउटपुट के रूप में सिंटैक्टिक रूप से एक ही जावास्क्रिप्ट कोड प्राप्त करने के लिए टाइपस्क्रिप्ट कंपाइलर के माध्यम से चलाया जाता है (यदि यह पहले स्थान पर वाक्यगत रूप से सही था)। यहां तक ​​कि जब टाइपस्क्रिप्ट कंपाइलर संकलन त्रुटियों को प्राप्त करता है तब भी यह एक .js फ़ाइल उत्पन्न करेगा। यह .js फ़ाइलों को --allowJs ध्वज के साथ इनपुट के रूप में भी स्वीकार कर सकता है। यह आपको तुरंत टाइपस्क्रिप्ट से शुरू करने की अनुमति देता है। दुर्भाग्यवश संकलन त्रुटियों की शुरुआत में होने की संभावना है। आपको यह याद रखने की ज़रूरत है कि ये शो-स्टॉपिंग त्रुटियां नहीं हैं जैसे कि आप अन्य कंपाइलरों के साथ उपयोग किए जा सकते हैं।

संकलन त्रुटियों को शुरुआत में तब मिलता है जब एक जावास्क्रिप्ट प्रोजेक्ट को टाइपस्क्रिप्ट प्रोजेक्ट में कनवर्ट करना टाइपस्क्रिप्ट की प्रकृति द्वारा अपरिहार्य है। टाइपस्क्रिप्ट वैधता के लिए सभी कोड जांचता है और इस प्रकार इसे उपयोग किए जाने वाले सभी कार्यों और चर के बारे में जानना आवश्यक है। इस प्रकार टाइपिंग की परिभाषा उन सभी के लिए होनी चाहिए अन्यथा संकलन त्रुटियां होने वाली हैं। जैसा कि ऊपर दिए गए अध्याय में बताया गया है, किसी भी जावास्क्रिप्ट ढांचे के लिए .d.ts फ़ाइलें हैं जिन्हें आसानी से कुछ typings install कमांड के साथ अधिग्रहित किया जा सकता है। हालांकि यह हो सकता है कि आपने कुछ अस्पष्ट लाइब्रेरी का उपयोग किया है जिसके लिए कोई टाइपस्क्रिप्ट परिभाषा उपलब्ध नहीं है या आपने कुछ जावास्क्रिप्ट प्राइमेटिव को पॉलीफिल किया है। संकलन त्रुटियों को गायब होने के लिए उस स्थिति में आपको इन बिट्स के लिए टाइप परिभाषाएं प्रदान करनी होंगी। बस एक .d.ts फ़ाइल बनाएं और इसे tsconfig.json की files सरणी में शामिल करें, ताकि इसे हमेशा टाइपस्क्रिप्ट कंपाइलर द्वारा माना जा सके। इसमें उन बिट्स की घोषणा करें जो टाइपस्क्रिप्ट को any प्रकार के बारे में नहीं पता है। एक बार जब आप सभी त्रुटियों को समाप्त कर देते हैं तो आप धीरे-धीरे अपनी आवश्यकताओं के अनुसार उन हिस्सों में टाइपिंग शुरू कर सकते हैं।

बिल्ड पाइपलाइन में टाइपस्क्रिप्ट प्राप्त करने के लिए आपकी बिल्ड पाइपलाइन को कॉन्फ़िगर करने के लिए कुछ कामों की भी आवश्यकता होगी। जैसा कि संकलन के अध्याय में बताया गया है वहां बहुत सारे अच्छे संसाधन हैं और मैं आपको बीज परियोजनाओं की तलाश करने के लिए प्रोत्साहित करता हूं जो उन उपकरणों के संयोजन का उपयोग करते हैं जिनके साथ आप काम करना चाहते हैं।

सीखने की वक्र सबसे बड़ी बाधा है। मैं आपको पहले एक छोटी परियोजना के साथ खेलने के लिए प्रोत्साहित करता हूं। देखें कि यह कैसे काम करता है, यह कैसे बनाता है, कौन सी फाइलें इसका उपयोग करती हैं, यह कैसे कॉन्फ़िगर किया जाता है, यह आपके आईडीई में कैसे कार्य करता है, यह कैसे संरचित किया जाता है, कौन से टूल्स इसका उपयोग करता है आदि। एक बड़े जावास्क्रिप्ट कोडबेस को टाइपस्क्रिप्ट में कनवर्ट करना बहुत ही कामयाब होता है जब आप पता है कि आप क्या कर रहे हैं, लेकिन जब आप नहीं करते तो यह निराशाजनक हो सकता है।

दत्तक ग्रहण

टाइपस्क्रिप्ट ओपन सोर्स (अपाचे 2 लाइसेंस प्राप्त है, जिथब देखें) और माइक्रोसॉफ्ट द्वारा समर्थित है। एंडर्स हेजल्सबर्ग , सी # के मुख्य वास्तुकार इस परियोजना का नेतृत्व कर रहे हैं। यह एक बहुत ही सक्रिय परियोजना है; टाइपस्क्रिप्ट टीम पिछले कुछ सालों में कई नई सुविधाएं जारी कर रही है और बहुत से महान लोगों को अभी भी आने की योजना है ( roadmap देखें)।

2017 में स्टैक ओवरफ्लो डेवलपर सर्वेक्षण टाइपस्क्रिप्ट सबसे लोकप्रिय जावास्क्रिप्ट ट्रांस्लर (9 वां स्थान समग्र) था और सबसे पसंदीदा प्रोग्रामिंग भाषा श्रेणी में तीसरा स्थान जीता।







javascript node.js promise try-catch