भिन्नता ले वर्णन गर्दछ कि कसरी मिश्रित प्रकारको सबटाइपिङ यसका भागहरूको सबटाइपिङसँग सम्बन्धित छ — अर्थात्, Container<Sub> लाई Container<Super> मा कहिले निर्दिष्ट गर्न सकिन्छ?
Dog लाई Animal को सबटाइप मान्नुहोस्।
let dogs: Dog[] = [];
let animals: Animal[] = dogs; // ✅ Dog[] is assignable to Animal[]
रिटर्न प्रकार र एरेहरू कोभेरिएंट छन्: यदि Dog ⊆ Animal, तब Dog[] ⊆ Animal[]। Dog फर्काउने फलन त्यहाँ प्रयोगयोग्य छ जहाँ Animal फर्काउने फलन अपेक्षित छ।
type Handler<T> = (arg: T) => void;
let animalHandler: Handler<Animal> = (a) => {};
let dogHandler: Handler<Dog> = animalHandler; // ✅ (with strictFunctionTypes)
// a handler that accepts ANY Animal can safely handle a Dog
फलन प्यारामिटरहरू कन्ट्राभेरिएंट छन्: Handler<Animal> लाई Handler<Dog> मा निर्दिष्ट गर्न सकिन्छ, जो तत्व सम्बन्धको विपरीत हो। यो सुरक्षित छ — जसले सबै जनावरलाई ह्यान्डल गर्दछ त्यो निश्चित रूपमा कुकुरलाई ह्यान्डल गर्दछ।
// Method parameters in TS are bivariant by default (a known unsound convenience)
interface Comparer<T> { compare(a: T): void; }
TypeScript ले स्ट्यान्डअलोन फलन प्रकारहरूलाई strictFunctionTypes अन्तर्गत मात्र कन्ट्राभेरिएंटली जाँच गर्दछ; विधि प्यारामिटरहरू उपयोगिता को लागि जानबूझकर द्विमुखी छन्, जो प्राविधिकतः अस्वस्थ छ।
भिन्नताले किन निश्चित असाइनमेन्टहरू अनुमति दिइन्छ वा अस्वीकार गरिन्छ भनेर व्याख्या गर्दछ — किन Dog[] ले Animal[] लाई मेल खाइन्छ तर (d: Dog) => void कलब्याक सधैं (a: Animal) => void को जागा खडा हुन सक्दैन।
यसको बोधले तपाईंलाई जेनेरिक API डिजाइन गर्न (उदा. पढ्ने-मात्र बनाम लेख्ने स्थान) र फलन र जेनेरिक्स समावेश गरी भ्रामक "निर्दिष्ट गर्न सकिदैन" त्रुटिहरू डिकोड गर्न मद्दत गर्दछ।
विस्तृत उत्तरसहित IT अन्तर्वार्ता प्रश्नहरूको पुस्तकालय — जुनियरदेखि सिनियरसम्म।
दान गर्नुहोस्