CodeBlanks Logo Icon CodeBlanks

Bivariance ve strict

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çerli

Method 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

index.ts
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

index.ts
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

Soru
class Animal {}
class Dog extends Animal {}

interface Kennel {
  // bivariant method:
  keep(d: Dog)____;
}
Cevap
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

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