टाइपस्क्रिप्ट: एक खाली टाइप किया हुआ कंटेनर सरणी बनाना


185

मैं टाइपस्क्रिप्ट में "थ्री ऑफ ए क्राइम" नाम का सरल लॉजिक गेम बना रहा हूं।

टाइपस्क्रिप्ट में पूर्व-आवंटित टाइप करने की कोशिश करते समय, मैंने ऐसा कुछ करने की कोशिश की:

var arr = Criminal[];

जिसने "अभिव्यक्ति शब्द का चेक प्रारूप" त्रुटि दी।

यह भी करने की कोशिश की

var arr : Criminal = [];

और यह "किसी भी [] को 'आपराधिक' में परिवर्तित नहीं कर सकता है

ऐसा करने का 'टाइपस्क्रिप्ट' तरीका क्या है?

जवाबों:


169

मौजूदा उत्तर एक विकल्प से चूक गए, इसलिए यहां एक पूरी सूची है:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. स्पष्ट रूप से प्रकार को निर्दिष्ट करना सामान्य समाधान है जब भी प्रकार परिवर्तन की घोषणा के लिए विफल रहता है।

  2. एक प्रकार के दावे का उपयोग करने का लाभ (कभी-कभी इसे कास्ट कहा जाता है, लेकिन यह वास्तव में टाइपस्क्रिप्ट में एक कास्ट नहीं है) किसी भी अभिव्यक्ति के लिए काम करता है, इसलिए इसका उपयोग तब भी किया जा सकता है जब कोई चर घोषित नहीं किया जाता है। प्रकार के अभिकथन के लिए दो वाक्यविन्यास हैं, लेकिन केवल बाद वाला JSX के साथ संयोजन में काम करेगा यदि आप इस बारे में परवाह करते हैं।

  3. ऐरे कंस्ट्रक्टर का उपयोग करना कुछ ऐसा है जो आपको इस विशिष्ट उपयोग के मामले में मदद करेगा, लेकिन जो मुझे व्यक्तिगत रूप से सबसे अधिक पठनीय लगता है। हालाँकि, रनटाइम * पर थोड़ा सा प्रदर्शन प्रभाव पड़ता है । इसके अलावा, अगर कोई ऐरे कंस्ट्रक्टर को फिर से परिभाषित करने के लिए पर्याप्त पागल था, तो अर्थ बदल सकता है

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

*: मजेदार तथ्य; क्रोम में प्रदर्शन अंतर लिखने के समय 60% था, जबकि फ़ायरफ़ॉक्स में औसत दर्जे का प्रदर्शन अंतर नहीं था।


60% ?? : हे जंगली
मैक्स कोपलान

239

टाइपस्क्रिप्ट में टाइप किए गए सरणी को सही ढंग से पूर्व-आवंटित करने का मुद्दा सरणी शाब्दिक सिंटैक्स के कारण कुछ अस्पष्ट था, इसलिए यह उतना सहज नहीं था जितना मैंने पहले सोचा था।

सही तरीका होगा

var arr : Criminal[] = [];

यह आपको 'अरेस्ट' वेरिएबल में स्टोर की गई एक सही टाइप की गई खाली जगह देगा।

आशा है कि यह दूसरों की मदद करता है!


20

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मुझे हाल ही में एक ऐसे ही मुद्दे का सामना करना पड़ा, जिसे इस तरह से हल नहीं किया जा सकता था, क्योंकि मुझे एक विशिष्ट प्रकार के खाली सरणी को वापस करना था।

मैं था

return [];

प्रकार कहाँ []थाCriminal[]

न तो return: Criminal[] [];है और न ही return []: Criminal[];मेरे लिए काम किया।

पहली नज़र में मैंने इसे वापस करने से ठीक पहले टाइप किया हुआ वैरिएबल (जैसा आपने सही बताया है) बनाकर इसे हल किया , लेकिन (मुझे नहीं पता कि जावास्क्रिप्ट इंजन कैसे काम करते हैं) यह ओवरहेड बना सकता है और यह कम पठनीय है।

संपूर्णता के लिए मैं इस समाधान को अपने उत्तर में भी रिपोर्ट करूंगा:

let temp: Criminal[] = [];
return temp;

आखिरकार मुझे टाइपस्क्रिप्ट टाइप कास्टिंग मिली, जिसने मुझे समस्या को अधिक संक्षिप्त और पठनीय (और शायद कुशल) तरीके से हल करने की अनुमति दी:

return <Criminal[]>[];

आशा है कि यह भविष्य के पाठकों की मदद करेगा!


1

नीचे की तरह सार्वजनिक रूप से उपयोग के लिए:

public arr: Criminal[] = [];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.