टाइपस्क्रिप्ट में क्लास टाइप चेक


240

ActionScript में, ऑपरेटर का उपयोग करके रन-टाइम पर प्रकार की जांच करना संभव है :

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

क्या यह पता लगाना संभव है कि एक चर (टाइप या विस्तार) टाइपस्क्रिप्ट के साथ एक निश्चित वर्ग या इंटरफ़ेस है?

मुझे इसके बारे में भाषा के चश्मे में कुछ भी नहीं मिला। कक्षाओं / इंटरफेस के साथ काम करते समय यह होना चाहिए।

जवाबों:


318

४.१ ९ .४ इंस्टाफॉपर ऑपरेटर

instanceofऑपरेटर प्रकार किसी भी या 'समारोह' इंटरफ़ेस प्रकार की एक उप-प्रकार के होने की किसी भी प्रकार की होनी चाहिए बाईं संकार्य, एक वस्तु प्रकार, या एक प्रकार पैरामीटर प्रकार, और सही संकार्य की आवश्यकता है। परिणाम हमेशा बूलियन आदिम प्रकार का होता है।

तो आप उपयोग कर सकते हैं

mySprite instanceof Sprite;

ध्यान दें कि यह ऑपरेटर एक्शनस्क्रिप्ट में भी है, लेकिन इसका उपयोग वहां नहीं किया जाना चाहिए:

ऑपरेटर, जो एक्शनस्क्रिप्ट 3.0 के लिए नया है, आपको यह जांचने की अनुमति देता है कि क्या चर या अभिव्यक्ति किसी दिए गए डेटा प्रकार का सदस्य है। ActionScript के पिछले संस्करणों में, Instof ऑपरेटर ने यह कार्यक्षमता प्रदान की, लेकिन ActionScript 3.0 में Instof ऑपरेटर का उपयोग डेटा प्रकार की सदस्यता के लिए परीक्षण करने के लिए नहीं किया जाना चाहिए। मैन्युअल प्रकार की जाँच के लिए इंस्टाफॉपर ऑपरेटर के बजाय ऑपरेटर का उपयोग किया जाना चाहिए, क्योंकि एक्स के एक्सप्रोफ़ y के अस्तित्व के लिए एक्सप्रोटेफ़ चेन केवल एक्स की प्रोटोटाइप श्रृंखला की जाँच करता है (और एक्शनस्क्रिप्ट 3.0 में, प्रोटोटाइप चेन पूरी तस्वीर प्रदान नहीं करता है वंशानुक्रम पदानुक्रम)।

टाइपस्क्रिप्ट के instanceofसमान समस्याएं हैं। जैसा कि यह एक भाषा है जो अभी भी इसके विकास में है मैं आपको इस तरह की सुविधा का प्रस्ताव देने की सलाह देता हूं।

यह सभी देखें:


54

टाइपस्क्रिप्ट में रनटाइम में वैरिएबल के प्रकार को मान्य करने का एक तरीका है। आप एक मान्य फ़ंक्शन जोड़ सकते हैं जो एक प्रकार का विधेय लौटाता है । तो आप इस फ़ंक्शन को एक if स्टेटमेंट के अंदर कॉल कर सकते हैं, और सुनिश्चित करें कि उस ब्लॉक के अंदर का सभी कोड सुरक्षित है जिस प्रकार से आपको लगता है कि यह है।

टाइपस्क्रिप्ट डॉक्स से उदाहरण:

function isFish(pet: Fish | Bird): pet is Fish {
   return (<Fish>pet).swim !== undefined;
}

// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
  pet.swim();
}
else {
  pet.fly();
}

अधिक देखें: https://www.typescriptlang.org/docs/handbook/advanced-types.html


29
यह रनटाइम टाइपकास्टिंग नहीं है, यह सिर्फ जाँच कर रहा है कि किसी वस्तु के पास कोई संपत्ति है या नहीं। यह यूनियन प्रकार के लिए अच्छा हो सकता है इसलिए इस विशिष्ट मामले के लिए काम करता है, लेकिन वास्तव में इसके लिए सब कुछ के लिए एक "थीथिंग" बनाने के लिए उल्लेखनीय नहीं है। इसके अलावा अगर मछली और पक्षी दोनों तैर सकते हैं तो आप बर्बाद होंगे। मुझे खुशी है कि मैं हेक्स का उपयोग कर रहा हूं जिसकी एक विश्वसनीय प्रकार की जाँच है ताकि आप कर सकें Std.is(pet, Fish), जो कि प्रकार, इंटरफेस आदि पर काम करता है
मार्क नॉल

4
मुझे यह उत्तर मददगार लगा, लेकिन मुझे लगता है कि आप इसे थोड़ा और सटीक होने के लिए ट्विक कर सकते हैं। isFishखुद विधेय कि बनाई गई है है, और उसके शरीर एक एक लाइनर विधेय होने की जरूरत नहीं है। इसका लाभ यह है कि संकलक संकलन समय पर उपयुक्त संभावित कार्यों को समझता है, लेकिन आपके कोड isFishको रनटाइम पर निष्पादित किया जाता है। आपके पास गार्ड भी एक instanceofबयान हो सकता है, उदाहरण के लिए return pet instanceof Fish(यह एक वर्ग है और एक इंटरफ़ेस नहीं है), लेकिन यह अनावश्यक होगा क्योंकि कंपाइलर instanceofसीधे समझता है।

4
इसे "उपयोगकर्ता निर्धारित प्रकार के गार्ड" भी कहा जाता है, देखें basarat.gitbooks.io/typescript/content/docs/types/…
जूलियन

@MarkKnol यह वास्तव में रनटाइम चेकिंग है, लेकिन अनुमान लगाने की क्षमता को टाइप टाइप के रूप में अच्छी तरह से समझाती है (मतलब: आप मुझ पर भरोसा कर सकते हैं कि यह टाइप X या Y होगा क्योंकि मैं रनटाइम पर इसका परीक्षण करूंगा)।
फ्लेविन वोल्केन

3
आप का उपयोग करने पर विचार कर सकते हैं (pet as Fish)क्योंकि tslinter के बारे में शिकायत करेंगे (<Fish>pet)। देखें tslint डॉक
ब्रायन

1

इसके लिए आप instanceofऑपरेटर का उपयोग कर सकते हैं । MDN से:

Instof ऑपरेटर परीक्षण करता है कि किसी निर्माता की प्रोटोटाइप प्रॉपर्टी किसी ऑब्जेक्ट की प्रोटोटाइप चेन में कहीं दिखाई देती है या नहीं।

यदि आपको पता नहीं है कि मैं कौन से प्रोटोटाइप और प्रोटोटाइप चेन हैं तो मैं इसे देखने की सलाह देता हूं। यहाँ एक JS (TS इस संबंध में समान कार्य करता है) उदाहरण है जो अवधारणा को स्पष्ट कर सकता है:

    class Animal {
        name;
    
        constructor(name) {
            this.name = name;
        }
    }
    
    const animal = new Animal('fluffy');
    
    // true because Animal in on the prototype chain of animal
    console.log(animal instanceof Animal); // true
    // Proof that Animal is on the prototype chain
    console.log(Object.getPrototypeOf(animal) === Animal.prototype); // true
    
    // true because Object in on the prototype chain of animal
    console.log(animal instanceof Object); 
    // Proof that Object is on the prototype chain
    console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
    
    console.log(animal instanceof Function); // false, Function not on prototype chain
    
    

इस उदाहरण में प्रोटोटाइप श्रृंखला है:

पशु> Animal.prototype> Object.prototype

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