Bivariance ve strict
- TypeScript kursu
- İleri seviye
- Ders 15/57
- 4 dk
Bivariance ile strictFunctionTypes farkını öğrenirsin.
Bivariance nedir?
Bivariance, parametre türlerinin hem covariant hem de contravariant olarak kabul edildiği esnek kuraldır. strictFunctionTypes kapalıyken tüm fonksiyon parametreleri bivariant denetlenir. Bu kural bazı güvenli olmayan atamalara izin verir ama eski koda uyumluluk için tutulmuştur.
class Animal {}
class Dog extends Animal {}
interface Kennel {
keep(d: Dog): void; // method shorthand
}
const k: Kennel = { keep(a: Animal) {} }; // bivariant: geçerliMethod ve function-typed property farkı
Aynı mantıksal fonksiyon, interface içinde method shorthand ile yazılırsa bivariant; function-typed property ile yazılırsa (strictFunctionTypes açıkken) contravariant denetlenir. Event handler tarzı kodlar genellikle method shorthand kullanır; bu yüzden DOM olay tipleriyle çalışırken bu esneklik gerekir.
interface A {
method(p: Dog): void; // bivariant (her zaman)
property: (p: Dog) => void; // contravariant (strict altında)
}Uygulama Method ile bivariance göster
Animal'dan türeyen Dog sınıfını tanımla. İçinde keep(d: Dog): void methodu bulunan bir Kennel interface'i yaz. Bir Kennel nesnesi oluştur ve keep metodunu (a: Animal) => {} imzasıyla uygula; bu bivariance sayesinde geçerlidir. Son olarak k.keep(new Dog()) çağrısı yapıp console.log("ok") yazdır.
Başlangıç kodu
class Animal {}
// Dog sınıfını Animal'dan türet
// Kennel interface'ini method shorthand ile tanımla
// Kennel nesnesini Animal kabul eden implementation'ıyla oluştur
// keep'i bir Dog ile çağır ve "ok" yazdırÖrnek çözüm
class Animal {}
class Dog extends Animal {}
interface Kennel {
keep(d: Dog): void;
}
const k: Kennel = {
keep(a: Animal) {}
};
k.keep(new Dog());
console.log("ok");Beklenen çıktı
ok
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangi bildirim strictFunctionTypes açıkken bile bivariant denetlenir?
- Function-typed property: prop: () => void
- Interface içinde method shorthand ile bildirilen fonksiyon Doğru cevap
- Arrow function ile yazılan const değişkeni
- Type alias () => void ile bildirilen fonksiyon türü
Açıklama: Method shorthand (name(p: T): R) her zaman bivariant denetlenir; strictFunctionTypes yalnızca function-typed property'leri etkiler.
2 Bivariance method bildirimi
class Animal {}
class Dog extends Animal {}
interface Kennel {
// bivariant method:
keep(d: Dog)____;
}
class Animal {}
class Dog extends Animal {}
interface Kennel {
// bivariant method:
keep(d: Dog): void;
}
Açıklama: Method shorthand keep(d: Dog): void her zaman bivariant denetlenir; strictFunctionTypes açıkken bile parametre contravariance'i gevşetir.
3 Bivariance parçaları
| Kavram | Anlamı |
|---|---|
strictFunctionTypes kapalı |
tüm parametreler bivariant |
Method shorthand |
her zaman bivariant |
Function-typed property |
strict altında contravariant |
Bivariance |
hem covariant hem contravariant |