Typescript: Alt sınıfta super anahtar kelimesini kullanarak üst sınıfta ok fonksiyonu ile tanımlanmış yöntemi nasıl çağırılır?


Verilen

class BaseClass{

  count:number=0;

  public someMethod=():void =>{
      this.count++;
  }
}

class ChildClass extends BaseClass{
  public someMethod=():void=>{
     super.someMethod();
     //Do more work here.
  }
}

Hata mesajını alıyorum:

Sadece temel sınıfın genel (public) yöntemlerine 'super' anahtarıyla erişilebilir.

@Basarat burada bazı bilgiler veriyor ama bu dil için gerçek bir hack gibi görünüyor. Prototip üzerinde bir fonksiyon tanımlamak için TypeScript ok operatörü

Bunun 'this' kelimesinin bağlamsal kullanımını koruyarak yapılması nasıl mümkün olabilir?

Ok fonksiyonlarını doğru kullanıyor muyum yoksa bunlar gerçekten sadece bir callback gibi bir şeyi tanımlamanın bir yöntemi olarak mı kullanılmalı?

Cevap #1

Tartışma uğruna, kendinizi varsayın

  • Yağ ok sözdizimini kullanıyoruz çünkü yöntemler kullanıcı arayüzü olayları veya geri çağırmalar tarafından tetikleniyor (benim durumumda Knockout tıklama olayları)
  • UI (veya geri çağırma) yanıtlayıcı kodunda tekrarları ortadan kaldırmak için miras almaya ihtiyaç var.

Asgari düzeyde geçici bir çözüm (zarif olmasa da) iki sorunu ele alan iki çağrıya fonksiyonunuzu bölmektir:

Class A {
    public handleScope = () => {
        return this.handleInheritance();
    }

    public handleInheritance() {
        // do work
    }
}

Class B extends A {
    public handleInheritance() {
         super.handleInheritance() // super works here
         // additional work
    }
}

İşlevleri iki katına çıkarmanın "çirkin" olduğunu kabul eden ilk kişiyim, ancak bence gördüğüm diğer seçeneklerden çok daha az çirkin. İsimlendirmeyi standartlaştırmaya yardımcı olmak için, tek satırlık "scoping" işlevini temel işlevin adıyla (örneğin myFunction) artı "Scoper" (yani myFunctionScoper) olarak adlandırıyorum. Bu ayrıca IDE dostudur çünkü kalıtılabilir işlevin adını yazmaya başladığınızda genellikle Scoper metodunu bir öneri olarak görürsünüz.

Cevap #2

ok fonksiyonları düzgün çalışır mı yoksa gerçekten sadece bir geri çağırma gibi bir şeyi bildirme yöntemi olarak mı kullanılmalıdır?

Gerçekte sadece geri çağrılar için kullanılmalıdır. Eğer bir sınıf hiyerarşisi istiyorsanız, o zaman prototype'ı kullanın. prototype aynı zamanda size bellek tasarrufu sağlar.

Zorunlu düzeltme: Sadece bir this vardır ve o da mevcut örnektir. Eğer alt sınıfta this.foo üzerine yazarsanız, temel örneğin this.foo kaybolur. Temel sürümü yapıcıda koruyun

class BaseClass{

  count:number=0;

  public someMethod=():void =>{
      this.count++;
  }
}

class ChildClass extends BaseClass{

  constructor(){      
      super();
      var baseSomeMethod = this.someMethod;
      this.someMethod = ()=>{
          // implement here 
      }
  }

}

İlgili makaleler