2013-02-06 26 views
97

के बीच का अंतर किसी टाइपप्रति में स्ट्रिंग और स्ट्रिंग के बीच अंतर पता है? क्या मैं यह मानने में सही हूं कि उन्हें वही होना चाहिए?टाइपप्रति: स्ट्रिंग और स्ट्रिंग

var a: String = "test"; 
var b: string = "another test"; 
a = b; 
b = a; // this gives a compiler error! 

संकलक का वर्तमान संस्करण का कहना है:

Type 'String' is not assignable to type 'string'. 
    'string' is a primitive, but 'String' is a wrapper object. 
    Prefer using 'string' when possible. 

एक बग है कि है?

उत्तर

91

यहां एक उदाहरण है जो अंतर दिखाता है, जो स्पष्टीकरण में मदद करेगा।

var s1 = new String("Avoid newing things where possible"); 
var s2 = "A string, in TypeScript of type 'string'"; 
var s3: string; 

String जावास्क्रिप्ट स्ट्रिंग प्रकार है, जो आप उपयोग नए तार बनाने के लिए कर सकता है। कोई भी ऊपर new कीवर्ड के उपयोग के बिना और स्पष्ट रूप से String वस्तु का उपयोग किए बिना एक नया स्ट्रिंग बनाता है के रूप में जावास्क्रिप्ट में शाब्दिक बेहतर माना जाता है यह करता है, उदाहरण के में तो s2

string टाइपप्रति स्ट्रिंग प्रकार है, जो आप चर, मापदंडों और वापसी मान टाइप करने के लिए उपयोग कर सकते हैं।

अतिरिक्त नोट्स ...

वर्तमान में (फरवरी 2013) s1 और s2 दोनों जावास्क्रिप्ट मान्य हैं। s3 मान्य टाइपस्क्रिप्ट है।

String का प्रयोग। आपको शायद इसे कभी भी उपयोग करने की आवश्यकता नहीं है, स्ट्रिंग अक्षर को स्ट्रिंग शुरू करने का सही तरीका होने के रूप में सार्वभौमिक रूप से स्वीकार किया जाता है। जावास्क्रिप्ट में, यह भी वस्तु शाब्दिक और भी सरणी शाब्दिक उपयोग करने के लिए बेहतर माना जाता है:

var arr = []; // not var arr = new Array(); 
var obj = {}; // not var obj = new Object(); 

तुम सच में स्ट्रिंग के लिए एक लगन थी, तो आप दो तरीकों में से एक में टाइपप्रति में इसका इस्तेमाल कर सकते हैं ...

var str: String = new String("Hello world"); // Uses the JavaScript String object 
var str: string = String("Hello World"); // Uses the TypeScript string type 
+0

थैंक्स इसे साफ़ करने के लिए। तो स्ट्रिंग मानों के साथ काम करने वाले अन्य libs का उपयोग करते समय संभावित टाइप रूपांतरण समस्याओं से बचने के लिए प्राइमेटिव प्रकार स्ट्रिंग का उपयोग करना सुरक्षित है (इस विचार के आधार पर कि कोई वास्तव में स्ट्रिंग (?) का उपयोग नहीं करता है)। स्ट्रिंग और स्ट्रिंग और उपाध्यक्ष के बीच असाइनमेंट को समान रूप से व्यवहार नहीं किया जाना चाहिए? – Paul0515

+1

यह वास्तव में उपयोग करने के लिए सुरक्षित है क्योंकि टाइपस्क्रिप्ट प्रकार आपको 100% संगत जावास्क्रिप्ट (या तो ES3 या ES5 स्वाद में, और संस्करण 1 ES6 स्वाद में) देने के लिए अलग कर दिए जाते हैं। मैं 'स्ट्रिंग' प्रकार और एक शाब्दिक प्रारंभिकरण का उपयोग करने की अनुशंसा करता हूं: 'var s: string =" My string ";'। रिकॉर्ड के लिए – Fenton

+0

, टाइप-इनफरेंस के लिए धन्यवाद, 'var s: string = "My String" 'var s =" My String "के समान है ... भी, इससे कोई फर्क नहीं पड़ता कि मैं इस प्रतिक्रिया को कितनी बार पढ़ता हूं, मैं मैं अभी भी टाइपस्क्रिप्ट में 'स्ट्रिंग' प्रकार के उद्देश्य को समझ नहीं रहा हूं, क्योंकि, दिन के अंत में, '(' मेरा स्ट्रिंग ') [' कन्स्ट्रक्टर '] === स्ट्रिंग' ... –

17

जावास्क्रिप्ट में दो प्रकार अलग हैं और टाइपस्क्रिप्ट - टाइपस्क्रिप्ट सिर्फ हमें एनोटेट करने के लिए वाक्यविन्यास देता है और साथ ही साथ प्रकारों की जांच भी करता है।

String किसी ऑब्जेक्ट इंस्टेंस को संदर्भित करता है जिसमें इसकी प्रोटोटाइप श्रृंखला में String.prototype है। आप इस तरह के एक उदाहरण को विभिन्न तरीकों से प्राप्त कर सकते हैं उदा। new String('foo') और Object('foo')। तुम्हें पता है, जैसे instanceof ऑपरेटर के साथ String प्रकार का एक उदाहरण के लिए परीक्षण कर सकते हैं myString instanceof String

string जावास्क्रिप्ट के आदिम प्रकारों में से एक है, और string मान प्राथमिक रूप से अक्षर के साथ बनाए जाते हैं उदा। 'foo' और "bar", और विभिन्न कार्यों और ऑपरेटरों के परिणाम प्रकार के रूप में। आप typeof myString === 'string' का उपयोग कर string प्रकार के लिए परीक्षण कर सकते हैं।

उस समय का विशाल बहुमत, string वह प्रकार है जिसका आप उपयोग करना चाहिए - लगभग सभी एपीआई इंटरफेस जो स्ट्रिंग लेते हैं या लौटते हैं, इसका उपयोग करेंगे। सभी जेएस आदिम प्रकारों को लपेटा जाएगा (boxed) वस्तुओं के रूप में उनका उपयोग करते समय उनके संबंधित ऑब्जेक्ट प्रकारों के साथ, उदा। गुणों या कॉलिंग विधियों तक पहुंच।चूंकि String वर्तमान में एक वर्ग के लिए एक इंटरफेस के बजाय TypeScript's core library में के रूप में घोषित किया जाता है, संरचनात्मक टाइपिंग मतलब यह है कि stringString की एक उप-प्रकार यही वजह है कि पहली रेखा से गुजरता संकलन प्रकार की जाँच करता है माना जाता है।