CodeBlanks Logo Icon CodeBlanks

Contravariance

Contravariance kuralını parametrelerde öğrenirsin.

Contravariance nedir?

Contravariance, alt tür ilişkisinin ters yönde korunduğu kuraldır. Eğer Dog, Animal'ın alt türüyse, (p: Animal) => void fonksiyonu (p: Dog) => void türünün alt türü sayılır. Çünkü Animal kabul eden bir fonksiyon her Dog'u da kabul edebilir. Bu kural strictFunctionTypes açıkken parametre türleri için uygulanır.

class Animal {}
class Dog extends Animal {}

const handleAnimal = (a: Animal) => console.log(a);
const handleDog: (d: Dog) => void = handleAnimal;  // strictFunctionTypes ile geçerli

Contravariance neden güvenlidir

Contravariance mantıken güvenlidir: (p: Dog) => void beklenen yerde, gerçek fonksiyon daha geniş bir tür olan Animal kabul ettiği için hiçbir Dog çağrısı başarısız olamaz. Tersini yaparsan fonksiyon yalnızca Dog'un özelliklerini kullanırken bir Cat gönderilebilir; bu nedenle o yön güvenli değildir ve strictFunctionTypes altında engellenir.

class Animal {}
class Cat extends Animal { meow() {} }
class Dog extends Animal { bark() {} }

const bad: (a: Animal) => void = (d: Dog) => d.bark();  // hata

Uygulama Contravariant atamayı göster

Animal'dan türeyen Dog sınıfını tanımla. (a: Animal) => void türünde bir fonksiyon yaz ve bunu (d: Dog) => void türündeki değişkene ata. Sonra bu değişkeni new Dog() ile çağır.

Başlangıç kodu

index.ts
class Animal {
  name = "animal";
}

// Dog sınıfını Animal'dan türet

// Animal kabul eden fonksiyonu yaz

// Fonksiyonu (d: Dog) => void türüne ata ve bir Dog ile çağır

Örnek çözüm

index.ts
class Animal {
  name = "animal";
}

class Dog extends Animal {}

const logAnimal = (a: Animal) => console.log(a.name);
const logDog: (d: Dog) => void = logAnimal;

logDog(new Dog());

Beklenen çıktı

animal

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 strictFunctionTypes açıkken hangi atama geçerlidir?

  • const f: (a: Animal) => void = (d: Dog) => console.log(d);
  • const f: Dog = new Animal();
  • const f: () => Dog = () => new Animal();
  • const f: (d: Dog) => void = (a: Animal) => console.log(a); Doğru cevap

Açıklama: Parametre contravariant'tır; Animal kabul eden fonksiyon, Dog beklenen parametre konumuna atanabilir.

2 Contravariant atama

Soru
class Animal {}
class Dog extends Animal {}

const logAnimal = (a: Animal) => console.log("animal");

const handler: (d: Dog) => void = ____;
Cevap
class Animal {}
class Dog extends Animal {}

const logAnimal = (a: Animal) => console.log("animal");

const handler: (d: Dog) => void = logAnimal;

Açıklama: logAnimal, Animal kabul eder; contravariance ile (d: Dog) => void beklentisine güvenle atanır.

3 Contravariance parçaları

Kavram Anlamı
Dog alt tür, Animal üst tür üst türe doğru alt tür ilişkisi
(p: Animal) => void (p: Dog) => void alt türü
strictFunctionTypes parametre contravariance uygular
Parametre türü Contravariance alanı

İleri seviye bölümündeki tüm dersler