વિવર્તન વર્ણન કરે છે કે કોમ્પોઝિટ પ્રકારનું સબટાઈપિંગ તેના ભાગોના સબટાઈપિંગ સાથે કેવી રીતે સંબંધિત છે — અર્થાત્, 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 ડિઝાઈન કરવામાં મદદ મેળવો છો (દા.ત. રીડ-ઓનલી વર્સસ લખવાનું સ્થાન) અને ફંક્શન અને જેનેરિક્સ સાથે સંબંધિત મૂંઝવણભરી "અસાધ્ય" ભૂલોને સમજો છો.