Cum sa faci o clasă de a pune în aplicare o semnătură de apel dactilografiat?

voturi
26

Am definit următoarea interfață dactilografiate:

interface MyInterface {
    () : string;
}

Această interfață pur și simplu introduce o semnătură de apel, care nu prezintă parametri și returnează un șir de caractere. Cum pot pune în aplicare acest tip într-o clasă? Am încercat următorii pași:

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

Compilatorul îmi tot spune că

Clasa „MyType“ declară interfață „MyInterface“, dar nu-l pună în aplicare: de tip „MyInterface“ necesită o semnătură de apel, dar de tip „MyType“ îi lipsește unul

Cum pot pune în aplicare semnătura de apel?

Întrebat 07/10/2012 la 15:22
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
11

Clasele nu se poate compara această interfață. Cel mai aproape puteți obține, cred că este această clasă, care va genera un cod care se potrivește funcțional interfața (dar nu și în funcție de compilator).

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

Acest lucru va genera cod de lucru, dar compilatorul va plânge că MyTypenu este apelabilă , deoarece are semnătura new() = 'string'(chiar dacă îl numesc cu new, acesta va returna un obiect).

Pentru a crea ceva care se potrivește actally interfața fără plângându compilator, va trebui să faci ceva de genul:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
Publicat 07/10/2012 la 16:32
sursa de către utilizator

voturi
4

Exemplele de cod din acest răspuns presupunem următoarea declarație:

var implementation: MyInterface;

Furnizarea o implementare a unei interfețe apelabile

Ca urmare a răspunsului acceptat , după cum a sugerat de către unii dintre ei comentatori, o funcție care se potrivește cu semnătura apelului interfața implementeaza implicit interfata. Astfel , puteți utiliza orice funcție de potrivire ca o punere în aplicare.

De exemplu:

implementation = () => "Hello";

Nu trebuie să specificați în mod explicit că funcția implementează interfața. Cu toate acestea, dacă doriți să fie explicite, puteți utiliza o distributie:

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

Asigurarea unei implementări reutilizabile

Dacă doriți să producă o implementare reutilizabil a interfetei ca tine in mod normal ar fi cu o interfață # Java sau C, păstrează doar funcția undeva accesibilă consumatorilor săi.

De exemplu:

function Greet() {
    return "Hello";
}

implementation = Greet;

Asigurarea unei implementări parametrizat

Este posibil să doriți să fie în măsură să parameterise punerea în aplicare în același mod în care s-ar putea parameterise o clasă. Iată un mod de a face acest lucru:

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

implementation = MakeGreeter("Hello");

Dacă doriți ca rezultatul să fie tastat ca interfata, trebuie doar să setați în mod explicit tipul de întoarcere sau aruncat valoarea fiind returnată.

Publicat 23/12/2013 la 02:45
sursa de către utilizator

voturi
1

În cazul în care, dacă interfața nevărsat ar trebui să aibă alte metode pe care le puteți face în felul următor:

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 ConsoleGreeterestefalse

Publicat 25/01/2018 la 08:08
sursa de către utilizator

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