टाइपस्क्रिप्ट टाइप सरणी उपयोग


96

मेरे पास टाइपस्क्रिप्ट क्लास परिभाषा है जो इस तरह से शुरू होती है;

module Entities {          

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = new Thing[100];
        }

ऐसा लगता है कि प्रकार की एक सरणी, अनुगामी जावास्क्रिप्ट सरणी प्रकार के लिए सही ढंग से अनुवादित नहीं होती है। यह उत्पन्न जावास्क्रिप्ट से एक स्निपेट है:

function Person(name) {
    this._name = name;
    this._possessions = new Entities.Thing[100]();
}

व्‍यक्तिगत कोड वाली निष्‍पादन कोड, _possession फ़ील्ड को इनिशियलाइज़ करने के प्रयास के दौरान एक अपवाद फेंकें:

त्रुटि "0x800a138f - Microsoft JScript रनटाइम त्रुटि: संपत्ति '100' का मान प्राप्त करने में असमर्थ: ऑब्जेक्ट अशक्त या अपरिभाषित है"।

यदि मैं _possession के प्रकार को बदल देता हूं any[] और _possession को new Array()अपवाद के साथ प्रारंभ नहीं करता है। क्या मैं कुछ भुल गया?

जवाबों:


120

यहाँ आपके सिंटैक्स में एक त्रुटि है:

this._possessions = new Thing[100]();

यह "चीजों की सरणी" नहीं बनाता है। चीजों की एक सरणी बनाने के लिए, आप बस सरणी शाब्दिक अभिव्यक्ति का उपयोग कर सकते हैं:

this._possessions = [];

यदि आप लंबाई सेट करना चाहते हैं, तो सरणी कंस्ट्रक्टर में से:

this._possessions = new Array(100);

मैंने एक संक्षिप्त कामकाजी उदाहरण बनाया है जिसे आप खेल के मैदान में आजमा सकते हैं ।

module Entities {  

    class Thing {

    }        

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = [];
            this._possessions.push(new Thing())
            this._possessions[100] = new Thing();
        }
    }
}

2
यह लंबाई को ठीक नहीं करता है, लेकिन इसके बजाय सरणी का प्रचार करना चाहिए
सेबस्टियन

आप private _possessions: Thing[] : []; कक्षा की परिभाषा में क्यों नहीं कर सकते ?
SuperUberDuper

54

आप इनमें से किसी को भी आज़मा सकते हैं। वे मुझे त्रुटियाँ नहीं दे रहे हैं।

यह ऐरे डिक्लेरेशन के लिए टाइपस्क्रिप्ट से सुझाई गई विधि भी है ।

Array<Thing>इसका उपयोग करके यह टाइपस्क्रिप्ट में जेनरिक का उपयोग कर रहा है। यह List<T>c # कोड में पूछने के समान है ।

// Declare with default value
private _possessions: Array<Thing> = new Array<Thing>();
// or
private _possessions: Array<Thing> = [];
// or -> prefered by ts-lint
private _possessions: Thing[] = [];

या

// declare
private _possessions: Array<Thing>;
// or -> preferd by ts-lint
private _possessions: Thing[];

constructor(){
    //assign
    this._possessions = new Array<Thing>();
    //or
    this._possessions = [];
}

3
आकार का प्रचार करने के लिए, का उपयोग करें new Array<Thing>(100)
डग डॉमनी

1
आप यह भी उपयोग कर सकते हैं ... <चीज> []
danday74

@ danday74 - मैंने आपकी विधि को शामिल करने के लिए अपडेट किया है, यह ts-lint recomended / latest config का उपयोग करते समय डिफ़ॉल्ट है।
किरन

9

अनुवाद सही है, अभिव्यक्ति की टाइपिंग नहीं है। टाइपस्क्रिप्ट गलत तरीके से एक्सप्रेशन के new Thing[100]रूप में टाइपिंग कर रहा है । Thingइंडेक्स ऑपरेटर का उपयोग करते हुए, इंडेक्स , एक कंस्ट्रक्टर फ़ंक्शन के लिए यह एक त्रुटि होनी चाहिए । C # में यह 100 तत्वों की एक सरणी आवंटित करेगा। जावास्क्रिप्ट में यह 100 के मान पर कॉल करता है Thingजैसे कि एक कंस्ट्रक्टर था। चूंकि यह मान है कि undefinedयह आपके द्वारा उल्लिखित त्रुटि उठाता है। जावास्क्रिप्ट और टाइपस्क्रिप्ट में आप new Array(100)इसके बजाय चाहते हैं।

आपको इसे CodePlex पर बग के रूप में रिपोर्ट करना चाहिए।


1
मुझे नया ऐरे (100) नहीं चाहिए। मुझे थिंग टाइप लिखना है। मुझे नहीं पता कि यह बग है या दस्तावेज़ की कल्पना की मेरी गलत व्याख्या।
क्लॉस नजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.