Jak vyrobit třída implementovat podpis volání na stroji?

hlasů
26

I definovali následující rozhraní na stroji:

interface MyInterface {
    () : string;
}

Toto rozhraní jednoduše zavádí podpis hovor, který trvá žádné parametry a vrací řetězec. Jak mohu implementovat tento typ ve třídě? Zkoušel jsem následující:

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

Kompilátor pořád říkal mi, že

Třídou ‚MyType‘ prohlašuje rozhraní ‚MyInterface‘ nikoli však k jeho realizaci: Type ‚MyInterface‘ vyžaduje podpis volání, ale typ ‚MyType‘ postrádá jednu

Jak mohu implementovat podpis volání?

Položena 07/10/2012 v 15:22
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
11

Třídy nemohou rovnat toto rozhraní. Nejbližší se můžete dostat, myslím, že je tato třída, která bude generovat kód, který funkčně odpovídá rozhraní (ale ne podle překladač).

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

To bude vytvářet pracovní kód, ale kompilátor si bude stěžovat, že MyTypenení callable protože má podpis new() = 'string'(i když, pokud jste jej volat new, vrátí objekt).

Chcete-li vytvořit něco, co actally odpovídá rozhraní bez kompilátoru stěžoval, budete muset udělat něco takového:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
Odpovězeno 07/10/2012 v 16:32
zdroj uživatelem

hlasů
4

Příklady kódu v tomto odpovědi předpokládají následující prohlášení:

var implementation: MyInterface;

Poskytování provádění disponibilního rozhraní

V návaznosti na přijatou odpověď , jak to navrhuje některé ze svých commentors, funkce, která odpovídá podpis volání rozhraní je implicitně implementuje rozhraní. Takže můžete použít libovolnou funkci odpovídající za implementaci.

Například:

implementation = () => "Hello";

Nemusíte explicitně určit, že funkce implementuje rozhraní. Nicméně, pokud chcete být explicitní, můžete použít obsazení:

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

Poskytnutí opakovaně použitelný implementaci

Chcete-li produkovat opakovaně použitelný implementaci rozhraní, jako byste za normálních okolností by se # rozhraní Java nebo C, jen uložit funkci někde přístupné pro své zákazníky.

Například:

function Greet() {
    return "Hello";
}

implementation = Greet;

Poskytnutí jejich parametry implementace

Možná budete chtít mít možnost nastavení parametrů provádění stejným způsobem, že byste mohla Parametrovat třídu. Zde je jeden způsob, jak to udělat:

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

implementation = MakeGreeter("Hello");

Pokud chcete, aby výsledek má být zadána jako rozhraní, prostě explicitně nastavit návratový typ nebo lité hodnota vracených.

Odpovězeno 23/12/2013 v 02:45
zdroj uživatelem

hlasů
1

V případě, že disponibilní rozhraní by mělo mít i jiné metody, které můžete udělat to takhle:

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!'

Nevýhoda: greeter instanceof ConsoleGreeterjefalse

Odpovězeno 25/01/2018 v 08:08
zdroj uživatelem

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