వైవిధ్యం సమ్మిళిత రకం యొక్క ఉపప్రకారం దాని భాగాల ఉపప్రకారంకు ఎలా సంబంధం కలిగి ఉంది అని వివరిస్తుంది — అంటే, Container<Sub> ఎప్పుడు Container<Super> కు కేటాయించబడుతుంది?
Dog ను Animal యొక్క ఉపప్రకారం అనుకుందాం.
వైవిధ్యం సమ్మిళిత రకం యొక్క ఉపప్రకారం దాని భాగాల ఉపప్రకారంకు ఎలా సంబంధం కలిగి ఉంది అని వివరిస్తుంది — అంటే, 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 లను (ఉదా. చదవడానికి-మాత్రమే vs రైట్ స్థానాలు) డిజైన్ చేయడానికి సహాయం చేస్తుంది మరియు విధులు మరియు సాధారణ వాటిని సంబంధితం చేసే గందరగోళమైన "కేటాయించదగినది కాదు" లోపాలను డీకోడ్ చేయడానికి సహాయం చేస్తుంది.
జూనియర్ నుండి సీనియర్ వరకు వివరణాత్మక సమాధానాలతో IT ఇంటర్వ్యూ ప్రశ్నల లైబ్రరీ.
విరాళం