Özet - Variance
- TypeScript kursu
- İleri seviye
- Ders 16/57
- 4 dk
Variance kurallarını karşılaştıran bir program yazarsın.
Özet - Variance
Variance kuralları bir alt tür ilişkisinin fonksiyon türlerine nasıl aktığını anlatır. Covariance ilişkiyi aynı yönde korur (dönüş türü, diziler). Contravariance ilişkiyi ters çevirir (parametre türü, strictFunctionTypes altında). Bivariance her iki yönü de kabul eder (method shorthand veya strict kapalıyken).
class Animal {}
class Dog extends Animal {}
// Covariance (dönüş türü):
const a: () => Animal = () => new Dog();
// Contravariance (parametre, strict altında):
const b: (d: Dog) => void = (x: Animal) => {};
// Bivariance (method shorthand):
interface Kennel { keep(d: Dog): void; }
const k: Kennel = { keep(x: Animal) {} };Uygulama Üç kuralı tek programda göster
Animal'dan türeyen Dog sınıfını tanımla. Üç şeyi göster: (1) Covariance: () => Dog fonksiyonunu () => Animal türüne ata ve dönen nesnenin name özelliğini yazdır. (2) Contravariance: (a: Animal) => void fonksiyonunu (d: Dog) => void türüne ata. (3) Bivariance: keep(d: Dog): void methodu olan Kennel interface'i yaz ve implementation'ı keep(a: Animal) {} ile uygula. Her bölümün başında console.log ile sırasıyla "covariance", "contravariance", "bivariance" etiketlerini yazdır.
Başlangıç kodu
class Animal {
name = "animal";
}
// Dog sınıfını tanımla
// 1) Covariance: () => Dog -> () => Animal
// 2) Contravariance: (a: Animal) => void -> (d: Dog) => void
// 3) Bivariance: Kennel interface ve implementationÖrnek çözüm
class Animal {
name = "animal";
}
class Dog extends Animal {}
console.log("covariance");
const makeAnimal: () => Animal = () => new Dog();
console.log(makeAnimal().name);
console.log("contravariance");
const dogHandler: (d: Dog) => void = (a: Animal) => {};
dogHandler(new Dog());
console.log("bivariance");
interface Kennel {
keep(d: Dog): void;
}
const k: Kennel = {
keep(a: Animal) {}
};
k.keep(new Dog());Beklenen çıktı
covariance animal contravariance bivariance
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir fonksiyon türünde dönüş türü nasıl denetlenir (strictFunctionTypes açık)?
- Invariant
- Contravariant
- Covariant Doğru cevap
- Bivariant
Açıklama: Dönüş türü her zaman covariant denetlenir; alt tür döndüren fonksiyon, üst tür döndüren beklentiye atanır.
2 Contravariant parametre için hangi tür
class Animal {}
class Dog extends Animal {}
// Contravariance örneği: h, Dog beklerken implementation Animal kabul eder
const h: (d: Dog) => void = (x: ____) => {};
class Animal {}
class Dog extends Animal {}
// Contravariance örneği: h, Dog beklerken implementation Animal kabul eder
const h: (d: Dog) => void = (x: Animal) => {};
Açıklama: Contravariance için parametre, hedefin parametresinin üst türü olmalıdır; Animal, Dog'un üst türü olduğundan doğrudur.
3 Variance kuralları eşleştirmesi
| Kavram | Anlamı |
|---|---|
Dönüş türü |
Covariance |
Parametre (strict altında) |
Contravariance |
Method shorthand |
Bivariance |
Dog döndüren fonksiyon |
Animal döndüren beklentiye atanır |