2016-05-25 11 views
9

मैं एंगुलरजेएस 2 और टाइपस्क्रिप्ट पर एक नज़र डाल रहा था और मैंने टाइपस्क्रिप्ट की मूल बातें सीखने के लिए कुछ करने का फैसला किया। कई शोधों के साथ मुझे मॉड्यूल, टाइपस्क्रिप्ट के बारे में अच्छे विषय मिलते हैं, और उनमें से एक वैरिएबल घोषित करने के लिए 'लेट' और 'var' कमांड के बारे में बात कर रहा था; this प्रश्न के अनुसार, नीचे टाइपप्रति कोड केवल एक चेतावनी प्रदर्शित करने और कंसोल में एक त्रुटि फेंक देना चाहिए:'चलो और' var 'टाइपस्क्रिप्ट में समान हैं?

test.ts:

for(let i = 0; i < 1; i++) { 
    alert(i); 
} 
alert(i); 

संकलित test.js:

for(var i = 0; i < 1; i++) { 
    alert(i); 
} 
alert(i); 
//# sourceMappingURL=test.js.map 

लेकिन ऐसा नहीं है। कंपाइलर "let" कमांड को "अनदेखा" करता है और इसे "var" कमांड में बदल देता है। ऐसा क्यों होता है? क्या टाइपस्क्रिप्ट केवल कक्षाओं के साथ ठीक से काम करता है?

मैं 'NPM स्टार्ट' के लिए AngularJS विन्यास का उपयोग कर रहा है, इसलिए यह मेरे 'test.ts' फ़ाइल स्वचालित रूप से संकलित:

"scripts": { 
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ", 
    "lite": "lite-server", 
    "postinstall": "typings install", 
    "tsc": "tsc", 
    "tsc:w": "tsc -w", 
    "typings": "typings" 
    }, 
+0

'टाइपप्रति में let' पर अधिक: https: // basarat .gitbooks.io/टाइपस्क्रिप्ट/सामग्री/दस्तावेज़/let.html – basarat

उत्तर

11

लेकिन ऐसा नहीं है। कंपाइलर "let" कमांड को "अनदेखा" करता है और इसे "var" कमांड में बदल देता है। ऐसा क्यों होता है? क्या टाइपस्क्रिप्ट केवल कक्षाओं के साथ ठीक से काम करता है?

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

आप इसे let कीवर्ड के साथ फेंकना चाहते हैं, तो आप ES6- "target": "es6"tsconfig.json या कमांड लाइन विकल्प --target es6 में लक्ष्य बनाना होगा। ऐसा करने से आपके द्वारा इनपुट किए गए उसी कोड के साथ आउटपुट होगा।

नोट है कि भले ही अपने कोड रनटाइम पर काम करता है, यह एक त्रुटि फेंकता है आप जानते हैं कि आप संकलन समय पर गलती की है यह बताने के लिए:

for(let i = 0; i < 1; i++) { 
    alert(i); 
} 
alert(i); // compile error: cannot find name 'i' 
2

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

अब अगर आप एक अलग उदाहरण का प्रयास करें, आपको लगता है कि let सिर्फ var में नहीं बदला गया है, लेकिन अधिक जादू होता देखेंगे:

for (let i = 0; i < 3; i++) { 
    setTimeout(function() { alert(i); }); 
} 
दरअसल इस उदाहरण let में

और var ही नहीं होती प्रभाव। let का उपयोग करते समय 1 2 3 प्रदर्शित करेगा, हम 3 3 3 देखेंगे। आप इस जाँच कर सकते हैं आप let कीवर्ड ES6 द्वारा शुरू की के बारे में अधिक जानने के लिए करना चाहते हैं:

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Instructions/let

+0

'i <1' तो शून्य (0)? * ऊपर * कि 'i <5' ताकि लोग वास्तव में जादू देख सकें। अंतरों की तुलना करने के लिए शायद 'var' का उपयोग करके एक ही लूप प्रदान करें। केवल एक सलाह। – Marcus

+0

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

+0

@ मैकर्स यहां पुनरावृत्तियों की संख्या बिंदु को नहीं बदलती है: जब हम सेटटाइमआउट के साथ स्टैक छोड़ते हैं तो ट्रांसमिशन पूरी तरह अलग होता है, भले ही यह केवल एक बार हो। आप देख सकते हैं कि https://www.typescriptlang.org/play/ – floribon

0

वे समान हैं, लेकिन वहाँ एक अंतर जब वे एक समारोह के अंदर किया जाता है।

चलो

function theDifference(){ 
    for(let emre = 0; emre < 10; emre++){ 
    // emre is only visible inside of this for() 
    } 

// emre is NOT visible here. 
} 

वीएआर

function theDifference(){ 
    for(var emre = 0; emre < 10; emre++){ 
    // emre is visible inside of this for() 
    } 

// emre is visible here too. 
} 
+0

यह एक अच्छा उदाहरण नहीं है। टाइपस्क्रिप्ट कंपाइलर शिकायत करेगा, लेकिन 'emre' वास्तव में' let' उदाहरण में 'for' के बाहर दिखाई देता है। – JohnnyHK

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