2016-10-17 8 views
8

मैं कुछ कोड है कि इस तरह दिखता है भर में आया था:टाइपस्क्रिप्ट में `is` कीवर्ड क्या करता है?

export function foo(arg: string): arg is MyType { 
    return ... 
} 

मैं या तो दस्तावेज़ या गूगल में is के लिए खोज करने में सक्षम मधुमक्खी नहीं किया है, यह एक बहुत आम शब्द है और मूल रूप से हर पृष्ठ पर दिखाई देता है।

कीवर्ड उस संदर्भ में क्या करता है?

उत्तर

5
function isString(test: any): test is string{ 
    return typeof test === “string”; 
} 

function example(foo: any){ 
    if(isString(foo)){ 
     console.log(“it is a string” + foo); 
     console.log(foo.length); // string function 
    } 
} 
example(“hello world”); 

प्रकार विधेय का उपयोग करते हुए ऊपर प्रारूप (बजाय सिर्फ वापसी प्रकार के लिए बूलियन उपयोग किए जाने वाले) में "परीक्षण स्ट्रिंग है", isString() कहा जाता है के बाद, समारोह TRUE देता , टाइपस्क्रिप्ट फ़ंक्शन पर कॉल द्वारा संरक्षित किसी भी ब्लॉक में स्ट्रिंग को टाइप करने के लिए संकीर्ण करेगा। संकलक सोचेंगे कि foo नीचे पहरा ब्लॉक में स्ट्रिंग है (और केवल नीचे पहरा ब्लॉक में)

{ 
    console.log(“it is a string” + foo); 
    console.log(foo.length); // string function 
} 

प्रकार विधेय सिर्फ संकलन समय में प्रयोग किया जाता है। परिणाम .js फ़ाइल (रनटाइम) में कोई फर्क नहीं पड़ता क्योंकि यह TYPE पर विचार नहीं करता है।

मैं चार उदाहरणों में अंतरों को चित्रित करूंगा।

E.g 1: उपरोक्त उदाहरण कोड में संकलन त्रुटि और रनटाइम त्रुटि नहीं होगी।

ईजी 2: नीचे दिए गए उदाहरण कोड में संकलन त्रुटि (साथ ही रनटाइम त्रुटि) होगी क्योंकि टाइपस्क्रिप्ट ने प्रकार को स्ट्रिंग में संकुचित कर दिया है और जांच की है कि एक्सपोनेंशियल स्ट्रिंग विधि से संबंधित नहीं है।

function example(foo: any){ 
    if(isString(foo)){ 
     console.log(“it is a string” + foo); 
     console.log(foo.length); 
     console.log(foo.toExponential(2)); 
} 
} 

उदा। 3: नीचे दिए गए उदाहरण कोड में संकलन त्रुटि नहीं है लेकिन रनटाइम त्रुटि होगी क्योंकि टाइपस्क्रिप्ट केवल अवरुद्ध ब्लॉक में स्ट्रिंग करने के लिए प्रकार को संकीर्ण करेगा, लेकिन बाद में नहीं, इसलिए foo.toExponential संकलन त्रुटि नहीं बनाएगा (टाइपस्क्रिप्ट नहीं लगता है कि यह है एक स्ट्रिंग प्रकार)। हालांकि, रनटाइम में, स्ट्रिंग में एक्सएक्सोनेंशियल विधि नहीं है, इसलिए इसमें रनटाइम त्रुटि होगी।

function example(foo: any){ 
    if(isString(foo)){ 
     console.log(“it is a string” + foo); 
     console.log(foo.length); 
} 
console.log(foo.toExponential(2)); 
} 

उदा। 4: यदि हम "टेस्ट स्ट्रिंग" (टाइप टाइप करें) का उपयोग नहीं करते हैं, तो टाइपस्क्रिप्ट ब्लॉक वाले प्रकार में प्रकार को संकीर्ण नहीं करेगा और नीचे दिए गए उदाहरण कोड में संकलन त्रुटि नहीं होगी लेकिन इसमें रनटाइम त्रुटि होगी।

function isString(test: any): boolean{ 
    return typeof test === “string”; 
} 
function example(foo: any){ 
    if(isString(foo)){ 
     console.log(“it is a string” + foo); 
     console.log(foo.length); 
     console.log(foo.toExponential(2)); 
} 
} 

निष्कर्ष यह है कि (प्रकार विधेय) "परीक्षण स्ट्रिंग है" डेवलपर्स कोड रनटाइम त्रुटि के लिए मौका होगा बताने के लिए संकलन समय में इस्तेमाल किया जाता है। जावास्क्रिप्ट के लिए, डेवलपर्स संकलन समय में त्रुटि नहीं जान पाएंगे। टाइपस्क्रिप्ट का उपयोग करने का यह लाभ है।

1

केवल उपयोग मैं जानता हूँ कि अपने उदाहरण में से एक है: एक "प्रकार विधेय" (arg is MyType) एक उपयोगकर्ता प्रकार गार्ड

परिभाषित में

देखें प्रकार गार्डस में परिभाषित किया जाता उपयोगकर्ता इस reference

यहाँ में एक और है निर्दिष्ट करने reference

+1

मैंने इसे दस्तावेज़ों में भी देखा, यह एक विचित्र डिजाइन निर्णय क्या है, इस मामले को पूरी तरह से 'बूलियन' दाएं लौटकर संभाला जा सकता है? – benjaminz

+0

@ बेंजामिनज़ यह एसओ पर अपना स्वयं का प्रश्न वारंट कर सकता है लेकिन मैं आपको एक अलग उदाहरण दिखा सकता हूं कि वे अलग कैसे हैं। 'Is' कीवर्ड वास्तव में प्रकार कास्टिंग कर रहा है और बाद में कोड में टाइप त्रुटियों को पकड़ सकता है। अधिक जानकारी के लिए [यह उदाहरण] (https://goo.by/WAlvg) देखें। – styfle

+0

@benjaminz मुझे नहीं लगता कि यह एक बूलियन द्वारा कैसे संभाला जा सकता है। टाइपस्क्रिप्ट को यह जानने की ज़रूरत है कि जिस कार्य में आप ऑब्जेक्ट पास करते हैं वह एक प्रकार के गार्ड की तरह काम कर रहा है। यदि यह सिर्फ सही या गलत प्रकार देता है, तो टाइपस्क्रिप्ट कैसे जान सकता है कि यह वास्तव में एक प्रकार का गार्ड है और न केवल कुछ मनमानी कार्य है जो वस्तु सत्य होने पर सत्य लौटाता है। वस्तु के प्रकार को सीमित करने के लिए यह कैसे पता चलेगा? दूसरा, यह कैसे पता चलेगा कि ऑब्जेक्ट के प्रकार को किस प्रकार सीमित करना है? क्या होगा यदि पैरामीटर तीन प्रकारों में से एक है? यह जानना आवश्यक है कि 'सत्य' एक विशिष्ट प्रकार से मेल खाता है। – pushkin

संबंधित मुद्दे