9

मान लीजिए मैं एक अंतरफलक हैप्रकार की जाँच और जेनरिक

class Rectangle implements Comparable<Rectangle> { 

    equals(other:Rectangle):boolean { 
     // logic 
     return true; 
    } 

} 

class Circle implements Comparable<Circle> { 

    equals(other:Circle):boolean { 
     // logic 
     return true; 
    } 

} 

क्यों टाइपप्रति आयत और वृत्त की तुलना के लिए अनुमति देता है?

let circle:Circle = new Circle(); 
let rectangle:Rectangle = new Rectangle(); 
console.log(circle.equals(rectangle)); 

यह मुझे चेतावनी नहीं करना चाहिए कि मैं चक्र के विधि के बराबर होती है करने के लिए असंगत प्रकार प्रदान की?

उत्तर

9

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

एक बार ये कक्षाएं अपने स्वयं के कार्यान्वयन को जोड़ती हैं तो बतख टाइपिंग विफल हो जाएगी और टाइपस्क्रिप्ट कंपाइलर आपको त्रुटियां देगा।

class Rectangle implements Comparable<Rectangle> { 

    width: number; 
    height: number; 

    equals(other:Rectangle): boolean { 
     // logic 
     return true; 
    } 

} 

class Circle implements Comparable<Circle> { 

    diameter: number; 

    equals(other:Circle): boolean { 
     // logic 
     return true; 
    } 

} 
6

क्योंकि आपके आयत और सर्किल संरचनात्मक रूप से समान हैं, टाइपप्रति विनिमेय प्रकार (देखें "बतख टाइपिंग") के रूप में उन्हें व्यवहार करता है। बस उन्हें करने के लिए कुछ परस्पर असंगत गुण जोड़कर अपने चक्र और आयत बाहर मांस:

class Rectangle implements Comparable<Rectangle> { 
    x: number; 
    equals(other:Rectangle):boolean {return true;} 
} 
class Circle implements Comparable<Circle> { 
    rad: number; 
    equals(other:Circle):boolean {return true;} 
} 

और तुम त्रुटि प्रदर्शित दिखाई देगा। यह संयोगवश है, वही कारण है कि आप सर्कल-टाइप किए गए var को एक ऑब्जेक्ट शाब्दिक असाइन कर सकते हैं, जब तक कि इसमें सही गुण हों:

var c: Circle = {rad: 1, equals:() => true} 
संबंधित मुद्दे