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