বৈচিত্র্য বর্ণনা করে কীভাবে একটি যৌগিক প্রকারের সাবটাইপিং এর অংশগুলির সাবটাইপিং এর সাথে সম্পর্কিত — অর্থাৎ কখন 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 এর জায়গা নিতে পারে না।