2016-02-27 7 views
7

से ऐरे का विस्तार करना मैं नीचे दिए गए कोड में क्या गलत कर रहा हूं?टाइपस्क्रिप्ट

मैं अपनी कक्षा MyNumberList पर Array का विस्तार करने और फिर इसका उपयोग करने का प्रयास कर रहा हूं। मैं जो देखता हूं वह यह है कि सूची में कोई आइटम नहीं जोड़ा जा रहा है। जब मैं सूची तत्वों तक पहुंचने का प्रयास करता हूं तो मुझे undefined मिलता है।

पी.एस मैं टाइपप्रति 1.8.2

class MyNumberList extends Array<number> { 

    constructor(...numbers: number[]) { 
    // looks like this is not working 
    super(...numbers); 
    } 
} 

let statusCodes: MyNumberList = new MyNumberList(10, 20, 30); 

console.log(statusCodes[0]);  // printing undefined 
console.log(statusCodes.length); // printing 0 

उत्तर

8

सरणी ES5 में नहीं बढ़ाई जा सकती उपयोग कर रहा हूँ, तो कोड है कि टाइपप्रति संकलक का उत्पादन सही ढंग से काम नहीं करता है। कोड यह अपने निर्माता के लिए पैदा करता है यह है:

function MyNumberList() { 
    var numbers = []; 
    for (var _i = 0; _i < arguments.length; _i++) { 
     numbers[_i - 0] = arguments[_i]; 
    } 
    _super.apply(this, numbers); 
} 

... जहां _superArray है। चीजों के सामान्य पाठ्यक्रम में, _super.apply(this, numbers) ठीक काम करेगा, लेकिन Array फ़ंक्शन अलग-अलग व्यवहार करता है जब इसे किसी कन्स्ट्रक्टर के रूप में बुलाया जाता है। ईएस 5 ट्रांसपेलरों को बेबेल और अन्य ES2015 (ES6) में एक ही समस्या है। सरणी से ठीक से प्राप्त करने के लिए जावास्क्रिप्ट इंजन के भीतर सुविधाओं की आवश्यकता होती है जो केवल ईएस 5 इंजन में मौजूद नहीं हैं।

आप करने के लिए अपने निर्माता कोड को बदलते हैं:

constructor(...numbers: number[]) { 
    super(); 
    this.push(...numbers); 
} 

... संभवत: यह आपके उदाहरण बस जाएँगे। मैं गारंटी नहीं दे सकता कि Array की अन्य विशेषताएं कितनी अच्छी तरह काम करती हैं।

+0

हम्म दिलचस्प है। आप जो कहते हैं वह समझ में आता है। मैं प्रथम श्रेणी के संग्रह को बनाने का प्रयास कर रहा था जहां मैं कुछ डोमेन-विशिष्ट संचालन के साथ 'ऐरे' से प्राप्त कार्यक्षमता में वृद्धि करूंगा। यह दुखद है कि यह नियमित वाक्यविन्यास के साथ काम नहीं करेगा। – codematix

+1

आपकी मदद @ टी-जे-क्रॉडर के लिए धन्यवाद। 'This.push (... संख्या) 'को कॉल करने पर आपका विकल्प काम करता प्रतीत होता है। हालांकि, यह जानने के लिए कि क्या और टूटता है, मुझे गहरी टिंकरिंग की आवश्यकता हो सकती है। टीआईएल, टाइपस्क्रिप्ट का उपयोग करते समय, पारदर्शी जावास्क्रिप्ट कोड को देखने और समझने का एक अच्छा विचार है। – codematix

+0

महान शोध, समाधान मेरे लिए काम करता है – BobbyTables