arayüz - Typescript soyut sınıf statik yöntemi zorunlu değil


TypeScript'te bu basit kodum var:

abstract class Config {
    readonly NAME: string;
    readonly TITLE: string;

    static CoreInterface: () => any
}

class Test implements Config {
    readonly NAME: string;
    readonly TITLE: string;
}

Test sınıfında CoreInterface() üyesi eksik olmasına rağmen, TypeScript buna itiraz etmiyor. Bunun nedeni nedir?

Her türetilmiş sınıfın, CoreInterface() statik fonksiyonunda kendisi hakkında bazı meta veriler sağlaması gerekiyor. Config sınıfını genişletebilir ve her alt sınıfın kendi CoreInterface() uygulamasını sağlamasını sağlayabilirim, ama alt sınıfların Config sınıfının üyelerinin hiçbirini otomatik olarak miras almasını istemiyorum. Bu yüzden "extends" yerine "implements" kullanıyorum.

Cevap #1

Yorumunuza dayanarak, aradığınızı başarmanın yolu şudur:

interface ConfigConstructor {
    CoreInterface: () => any;
    new (): Config;
}

interface Config {
    readonly NAME: string;
    readonly TITLE: string;
}

const Test: ConfigConstructor = class Test implements Config {
    readonly NAME: string;
    readonly TITLE: string;

    static CoreInterface = function (): any { return "something"; }
}

(oyun alanında kod)

Üyelerden birini yorum satırı haline getirirseniz (örneğin: NAME) bu hatayı alırsınız:

Sınıf 'Test', 'Config' arayüzünü yanlış uyguluyor.
'NAME' özelliği 'Test' türünde eksik.

Eğer statik CoreInterface'i yorum satırı yaparsanız, bu hatayı alırsınız:

‘typeof Test’ türü ‘ConfigConstructor’ türüne atanamaz.
‘CoreInterface’ özelliği ‘typeof Test’ türünde eksik.

Orijinal cevap

Statik üyeler/metotlar kalıtımla çalışmaz (bu genel olarak nesne yönelimli programlama için geçerlidir ve TypeScript'e özgü değildir) çünkü (@JBNizet'in yorumladığı gibi) tüm statik özellikler sınıfın kendisine aittir, örneklere değil.

Wikipedia maddesinde yazıldığı gibi:

Statik bir yöntem, sınıfın henüz hiçbir örneği olmasa bile çağrılabilir. Statik yöntemlere "statik" denir çünkü çağrıldıkları sınıfa göre derleme zamanında çözülürler ve örnek yöntemlerde olduğu gibi nesnenin çalışma zamanı türüne bağlı olarak dinamik şekilde çözülmezler. Bu nedenle, statik yöntemler geçersiz kılınamaz.

Ayrıca bu konuyu da inceleyin: Statik yöntemler neden iyi bir Nesne Yönelimli uygulama olarak düşünülmez?

Başarmak istediğiniz şeye gelince, sınıfı genişlettiğinizde statik metodu uygulamadığınız için derleme hataları alamayacaksınız, ancak çalışma zamanı hataları alabilirsiniz:

class A {
    static fn() {
        throw new Error("not implemented!");
    }
}

class B extends A {
    static fn() {
        console.log("B.fn");
    }
}

class C extends A { }

B.fn(); // ok
C.fn(); // error: not implemented!

(oyun alanında kod)

İlgili makaleler