Athrú cur síos a dhéanann ar conas a bhaineann subtyping de chineál comhdhéanta le subtyping a gcuid.
I ngiorrú, cathain is féidir Container<Sub> a shannadh do Container<Super>?
Bíodh Dog ina fhoshort de .
Athrú cur síos a dhéanann ar conas a bhaineann subtyping de chineál comhdhéanta le subtyping a gcuid.
I ngiorrú, cathain is féidir Container<Sub> a shannadh do Container<Super>?
Bíodh Dog ina fhoshort de .
Animallet dogs: Dog[] = [];
let animals: Animal[] = dogs; // ✅ Dog[] is assignable to Animal[]
Fillteán agus eagar a bhaineann le comhathraitheas: má bhíonn Dog ⊆ Animal, ansin Dog[] ⊆ Animal[]. Is féidir feidhm a bhíonn ag filleadh Dog a úsáid áit ar bhreithniú go bhfuil Animal ag filleadh ann.
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
Paraiméadair feidhme a bhaineann le frithathraitheas: tá Handler<Animal> iomlán do Handler<Dog>, an taobh eile den ghaol eiliminte. Tá sé seo soladach — cinnte go bhfuil rud a dhéileálann le gach ainmhí ag déileáil le madraí.
// Method parameters in TS are bivariant by default (a known unsound convenience)
interface Comparer<T> { compare(a: T): void; }
TypeScript scrúdaíonn cineálacha feidhme neamhspleáche go frithathraithach i gcónaí faoin strictFunctionTypes amháin; paraiméadair an mhodh atá beartaithe go dearfach déathraitheach ar son ergonomics, atá go teicniúil neamhsoladach.
Míníonn athrú cén fáth ar ceadaítear nó ar dhiúltaítear do shannanna ar leith — cén fáth ar oireann Dog[] do Animal[] ach nach féidir le gealltanas (d: Dog) => void a bheith ina ionad i gcónaí do (a: Animal) => void.