'अज्ञात' बनाम 'कोई'


190

टाइपस्क्रिप्ट 3.0 unknownउनके विकि के अनुसार टाइप का परिचय देता है :

अज्ञात अब एक आरक्षित प्रकार का नाम है, क्योंकि यह अब एक अंतर्निहित प्रकार है। अज्ञात के आपके इच्छित उपयोग के आधार पर, आप घोषणा को पूरी तरह से हटा सकते हैं (नए शुरू किए गए अज्ञात प्रकार के पक्ष में), या इसे किसी अन्य चीज़ के लिए नाम बदलें।

बीच क्या अंतर है unknownऔर any? जब हम का उपयोग करना चाहिए unknownसे अधिक any?

जवाबों:


233

आप PR या RC घोषणा के बारे unknownमें अधिक पढ़ सकते हैं , लेकिन इसका सार यह है:

[..] अज्ञात जो किसी भी प्रकार का सुरक्षित प्रतिरूप है। कुछ भी अज्ञात के लिए असाइन करने योग्य है, लेकिन अज्ञात कुछ भी करने के लिए, लेकिन खुद को और किसी भी प्रकार के दावे या नियंत्रण प्रवाह आधारित संकीर्णता के लिए उपलब्ध नहीं है। इसी तरह, किसी भी ऑपरेशन को पहले विशिष्ट या अधिक विशिष्ट प्रकार तक सीमित किए बिना किसी अज्ञात पर अनुमति नहीं है।

कुछ उदाहरण:

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

सुझाया गया उपयोग है:

अक्सर ऐसे समय होते हैं जहां हम टाइपस्क्रिप्ट में सबसे कम-सक्षम प्रकार का वर्णन करना चाहते हैं। यह एपीआई के लिए उपयोगी है जो संकेत करना चाहता है "यह किसी भी मूल्य का हो सकता है, इसलिए आपको इसका उपयोग करने से पहले कुछ प्रकार की जांच करनी चाहिए"। यह उपयोगकर्ताओं को सुरक्षित रूप से लौटाए गए मूल्यों का आत्मनिरीक्षण करने के लिए मजबूर करता है।


35
C # बैकग्राउंड से आने वाला कोई भी हो, anyपसंद है dynamicऔर unknownपसंद है object। मुझे पसंद है unknownक्योंकि यह सिर्फ अधिक सुरक्षित है। हालांकि भ्रमित करने वाले नाम।
नवाफाल

1
मैं नहीं जानता कि यह तुलना करने के लिए उचित है unknownऔर object@nffal हालांकि मुझे लगता है कि मुझे लगता है कि आप जो देख रहे हैं वह विपरीत और कोविरेंस के संदर्भ में मिल रहा है (जैसे कोई भी वस्तु टाइप करने योग्य है, objectहालांकि unknownकिसी भी वस्तु या आदिम के लिए असाइन किया जा सकता है - इसी तरह या खुद unknownको सौंपा जा सकता anyहै और खुद objectको सौंपा जा सकता dynamicहै)। एक तरफ ध्यान दें कि मैं स्पष्ट नहीं हूँ कि टीएस डॉक्स unknownएक शीर्ष प्रकार के रूप में क्यों संदर्भित हैं क्योंकि इसमें वास्तव में सभी प्रकार ¯_ (¯) _ / ¯ शामिल नहीं हैं
जॉर्डन

38

अज्ञात और किसी के बीच का अंतर निम्नानुसार है:

बहुत पसंद है any, किसी भी मूल्य के लिए असाइन किया गया है unknown; हालाँकि, इसके विपरीत any, आप प्रकार के साथ किसी भी गुण तक नहीं पहुँच unknownसकते, और न ही आप उन्हें कॉल / निर्माण कर सकते हैं। इसके अलावा, प्रकार के मूल्यों को unknownकेवल सौंपा जा सकता है unknownया any

जब आप का उपयोग करना चाहिए के अपने सवाल का जवाब देने unknownसे अधिक any:

यह एपीआई के लिए उपयोगी है जो संकेत करना चाहता है "यह किसी भी मूल्य का हो सकता है, इसलिए आपको इसका उपयोग करने से पहले कुछ प्रकार की जांच करनी चाहिए "। यह उपयोगकर्ताओं को सुरक्षित रूप से लौटाए गए मूल्यों का आत्मनिरीक्षण करने के लिए मजबूर करता है।

प्रकार के चर की जाँच करने और अधिक विस्तृत विवरण के उदाहरणों के लिए टाइपस्क्रिप्ट 3.0 घोषणा पर एक नज़र डालें unknown


21

any प्रकार:

anyप्रकार सभी संभव जे एस मान का प्रतिनिधित्व करता है। टाइप करने के लिए हर प्रकार असाइन किया गया है any। इसलिए प्रकार anyप्रकार प्रणाली का एक सार्वभौमिक सुपरटाइप है। टीएस कंपाइलर टाइप किए गए मूल्यों पर किसी भी ऑपरेशन की अनुमति देगा any। उदाहरण के लिए:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

कई मौकों में यह टीएस कंपाइलर से बहुत ज्यादा प्रभावित है। अर्थात यह उन परिचालनों की अनुमति देगा, जिन्हें हम एक रनटाइम त्रुटि के कारण जान सकते थे।

unknown प्रकार:

unknownप्रकार (जैसे का प्रतिनिधित्व करता है any) के लिए सभी संभव जे एस मान। टाइप करने के लिए हर प्रकार असाइन किया गया है unknown। इसलिए unknownटाइप सिस्टम का एक और सार्वभौमिक सुपरटेप है (साथ any)। हालाँकि, TS कंपाइलर टाइप किए गए मानों पर किसी भी ऑपरेशन की अनुमति नहीं देगा unknown। इसके अलावा, unknownप्रकार केवल प्रकार के लिए ही उपलब्ध है any। एक उदाहरण यह स्पष्ट करेगा:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.