Contravariance
- TypeScript kursu
- İleri seviye
- Ders 14/57
- 4 dk
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çerliContravariance 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(); // hataUygulama 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
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
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
class Animal {}
class Dog extends Animal {}
const logAnimal = (a: Animal) => console.log("animal");
const handler: (d: Dog) => void = ____;
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ı |