CodeBlanks Logo Icon CodeBlanks

Decorator fabrikaları

Parametreli decorator'ları öğrenirsin.

Decorator fabrikaları

Decorator fabrikası, decorator döndüren bir fonksiyondur. Parametre alarak decorator'u özelleştirmeni sağlar: @Etiketli("demo") class Foo {}. Burada Etiketli("demo") önce çağrılır, dönen decorator fonksiyonu sonra sınıfa uygulanır. Böylece aynı decorator'u farklı parametrelerle yeniden kullanabilirsin.

function Etiketli(etiket: string) {
  return function(ctor: any): any {
    console.log(etiket);
    return ctor;
  };
}

@Etiketli("demo")
class Foo {}

İki adımlı çağrı

Fabrika kullanımı iki adımlıdır: önce fabrika parametrelerle çağrılır ve bir decorator döner; sonra bu decorator hedefe uygulanır. Etiketli("demo")(Foo) yazımı, Etiketli("demo")'nun döndürdüğü decorator'un Foo'ya uygulanmasıdır. Bu, @Etiketli("demo") class Foo {} yazımının eşdeğeridir.

Uygulama Etiketli fabrika yaz

Etiketli fabrikası yaz: (etiket: string) alsın ve (ctor: any): any imzalı bir decorator fonksiyonu döndürsün. Döndürülen decorator, console.log("etiket: " + etiket) yazdırsın ve ctor'yu döndürsün. Foo sınıfı yaz; selam metodu "merhaba" döndürsün. Fabrikayı "demo" etiketiyle çağırıp dönen decorator'u Foo sınıfına iki adımlı uygula ve sonucu DecoratedFoo'ya ata. Elde edilen sınıfın yeni örneğinden selam metodunu çağır ve sonucu yazdır.

Başlangıç kodu

index.ts
// Etiketli fabrikasını yaz: etiket: string alır
// (ctor: any): any imzalı bir decorator döndürsün
// Decorator "etiket: " + etiket yazdırsın, ctor döndürsün
// Foo sınıfı yaz, selam metodu "merhaba" döndürsün
// Fabrikayı "demo" etiketiyle çağır, dönen decorator'u Foo'ya uygula
// DecoratedFoo'ya ata
// yeni örnek üzerinden selam metodunu çağır, sonucu yazdır

Örnek çözüm

index.ts
function Etiketli(etiket: string): (ctor: any) => any {
  return function(ctor: any): any {
    console.log("etiket: " + etiket);
    return ctor;
  };
}

class Foo {
  selam(): string {
    return "merhaba";
  }
}

const DecoratedFoo = Etiketli("demo")(Foo);
console.log(new DecoratedFoo().selam());

Beklenen çıktı

etiket: demo
merhaba

Soru ve cevaplar

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

1 Bir decorator fabrikası ne döndürür?

  • Bir string değeri
  • Bir sınıf örneği
  • Bir decorator fonksiyonu Doğru cevap
  • Bir constructor fonksiyonu

Açıklama: Fabrika, decorator döndürür; dönen decorator daha sonra hedefe uygulanır. Sınıf örneği, string veya constructor dönmez; bunlar decorator'un değil, decorator'ın hedefinin parçalarıdır.

2 Fabrika parametresi

Soru
function Etiketli(____): (ctor: any) => any {
  return function(ctor: any): any {
    console.log(etiket);
    return ctor;
  };
}
Cevap
function Etiketli(etiket: string): (ctor: any) => any {
  return function(ctor: any): any {
    console.log(etiket);
    return ctor;
  };
}

Açıklama: Fabrika, özelleştirme parametresi alır (etiket). ctor decorator'ın iç fonksiyonunun parametresidir; target ve key ise metot/özellik decorator'larına aittir, fabrikaya değil.

3 Fabrika parçaları

Kavram Anlamı
Etiketli("demo") Fabrika çağrısı
return function(ctor) Döndürülen decorator
etiket: string Fabrika parametresi
Etiketli("demo")(Foo) İki adımlı uygulama

Orta seviye bölümündeki tüm dersler