Nasıl bir sınıf daktilo bir çağrı imza uygulamak için?

oy
26

Ben daktilo versiyonunda aşağıdaki arayüz tanımlamış:

interface MyInterface {
    () : string;
}

Bu arayüz sadece herhangi bir parametre alır ve bir dize döndürür bir çağrı imza tanıtır. Nasıl bir sınıfta bu tür uygularım? Ben aşağıdaki denedim:

class MyType implements MyInterface {
    function () : string {
        return Hello World.;
    }
}

derleyici olduğunu söyleyip duruyor

Class 'MyType' arabirim 'MyInterface' beyan ama bunu uygulamıyor: Tür 'Arayüzüm' çağrısı gereken imza Türü 'MyType' birini yoksun

Nasıl çağrı imza uygulayabilir?

Oluştur 07/10/2012 saat 15:22
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
11

Sınıflar o arayüzü aynı olamaz. Bence, alabileceğiniz en yakın (derleyici göre değil) işlevsel arayüzü ile eşleşen kodu üretecektir bu sınıftır.

class MyType implements MyInterface {
  constructor {
    return "Hello";
  }
}
alert(MyType());

Bu kod çalışma oluşturacak ancak şikayet edecek derleyici MyTypeo imza olduğundan çağrılabilir değil new() = 'string'(eğer bunu ararsanız rağmen new, bu nesneyi döndürür).

actally derleyici şikayet olmadan arayüzü ile eşleşen bir şey yaratmak için, böyle bir şey yapmak gerekir:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
Cevap 07/10/2012 saat 16:32
kaynak kullanıcı

oy
4

Bu cevap kod örnekleri şu bildiriyi varsayalım:

var implementation: MyInterface;

Bir çağrılabilir arabirimi uygulaması sağlanması

Bir devamı olarak kabul edilen yanıt olarak kendi commentors bazı arabirimin çağrı imzası örtülü arabirimini uygulayan eşleşen bir işlev tarafından önerdi. Yani bir uygulama olarak eşleşen herhangi işlevini kullanabilirsiniz.

Örneğin:

implementation = () => "Hello";

Açıkça fonksiyon arabirimini uygulayan belirtmek gerekmez. Eğer açık olmak istiyorsanız Ancak, bir döküm kullanabilirsiniz:

implementation = <MyInterface>() => "Hello";

yeniden kullanılabilir bir uygulama sağlanması

Eğer sizin gibi arayüzünün yeniden kullanılabilir uygulanmasını üretmek istiyorsanız normalde bir Java veya C # arayüzü ile, sadece kendi tüketicilere erişilebilir bir yerde fonksiyon kaydetmek istiyorum.

Örneğin:

function Greet() {
    return "Hello";
}

implementation = Greet;

parametrik uygulanmasını sağlamak

Eğer bir sınıf parametre cinsinden olabilir aynı şekilde uygulanmasını parametreleştirilmesi muktedir isteyebilirsiniz. İşte bunu yapmanın bir yolu şudur:

function MakeGreeter(greeting: string) {
    return () => greeting;
}

implementation = MakeGreeter("Hello");

Eğer sonuç sadece açıkça dönüş türünü ayarlamak veya değer iade edilen dökme, arayüz olarak yazılmasını istiyorum.

Cevap 23/12/2013 saat 02:45
kaynak kullanıcı

oy
1

durumda çağrılabilir arayüzü böyle yapabilirsin diğer yöntemleri olmalıdır eğer:

interface Greeter {
    (): void;
    setName(name: string): void;
}

class ConsoleGreeter {

    private constructor( // constructable via `create()`
        private name = 'world'
    ) {}

    public call(): void {
        console.log(`Hello ${this.name}!`);
    }

    public setName(name: string) {
        this.name = name;
    }

    public static create(): Greeter {
        const instance = new ConsoleGreeter();
        return Object.assign(
            () => instance.call(),
            {
                setName: (name: string) => instance.setName(name)
                // ... forward other methods
            }
        );
    }
}

const greeter = ConsoleGreeter.create();
greeter.setName('Dolly');
greeter(); // prints 'Hello Dolly!'

Dezavantajı: greeter instanceof ConsoleGreeterolduğunufalse

Cevap 25/01/2018 saat 08:08
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more