web-dev-qa-db-fra.com

Définition du type de rappel TypeScript

J'ai la classe suivante dans TypeScript:

class CallbackTest
{
    public myCallback;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

J'utilise la classe comme ceci:

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

Le code fonctionne, donc il affiche une boîte de message comme prévu.

Ma question est la suivante: y at-il un type que je peux fournir pour mon champ de classe myCallback? Pour le moment, le champ public myCallback est de type any comme indiqué ci-dessus. Comment définir la signature de méthode du rappel? Ou puis-je simplement définir le type sur une sorte de type de rappel? Ou puis-je faire moins de ceux-ci? Dois-je utiliser any (implicite/explicite)?

J'ai essayé quelque chose comme ça, mais ça n'a pas fonctionné (erreur de compilation):

public myCallback: ();
// or:
public myCallback: function;

Je n'ai trouvé aucune explication à cette question en ligne, j'espère que vous pourrez m'aider.

137
nikeee

Je viens de trouver quelque chose dans la spécification du langage TypeScript, c'est assez simple. J'étais assez proche.

la syntaxe est la suivante:

public myCallback: (name: type) => returntype;

Dans mon exemple, ce serait

class CallbackTest
{
    public myCallback: () => void;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}
180
nikeee

Pour aller plus loin, vous pouvez déclarer un pointeur de type sur une signature de fonction comme:

interface myCallbackType { (myArgument: string): void }

et l'utiliser comme ça:

public myCallback : myCallbackType;
128
Leng

Vous pouvez déclarer un nouveau type:

declare type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

Mise à jour.

Le mot clé declare n'est pas nécessaire. Il devrait être utilisé dans les fichiers .d.ts ou dans des cas similaires.

51
TSV

Voici un exemple - n'accepter aucun paramètre et ne rien retourner.

class CallbackTest
{
    public myCallback: {(): void;};

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

Si vous souhaitez accepter un paramètre, vous pouvez également l'ajouter:

public myCallback: {(msg: string): void;};

Et si vous voulez renvoyer une valeur, vous pouvez aussi ajouter cela:

public myCallback: {(msg: string): number;};
29
Fenton

Si vous voulez une fonction générique, vous pouvez utiliser ce qui suit. Bien que cela ne semble pas être documenté nulle part.

class CallbackTest {
  myCallback: Function;
}   
9
Ash Blue

Je suis tombé sur la même erreur en essayant d'ajouter le rappel à un écouteur d'événement. Étrangement, définir le type de rappel sur EventListener a résolu le problème. Cela semble plus élégant que de définir une signature de fonction entière en tant que type, mais je ne suis pas sûr que ce soit la bonne façon de procéder.

class driving {
    // the answer from this post - this works
    // private callback: () => void; 

    // this also works!
    private callback:EventListener;

    constructor(){
        this.callback = () => this.startJump();
        window.addEventListener("keydown", this.callback);
    }

    startJump():void {
        console.log("jump!");
        window.removeEventListener("keydown", this.callback);
    }
}
1
Kokodoko

Vous pouvez utiliser les éléments suivants:

  1. Tapez Alias ​​(utilisez le mot clé type, aliasant un littéral de fonction)
  2. Interface
  3. Fonction littérale

Voici un exemple d'utilisation.

type myCallbackType = (arg1: string, arg2: boolean) => number;

interface myCallbackInterface { (arg1: string, arg2: boolean): number };

class CallbackTest
{
    // ...

    public myCallback2: myCallbackType;
    public myCallback3: myCallbackInterface;
    public myCallback1: (arg1: string, arg2: boolean) => number;

    // ...

}
0