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.
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
}
}
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;
Vous pouvez déclarer un nouveau type:
declare type MyHandler = (myArgument: string) => void;
var handler: MyHandler;
Le mot clé declare
n'est pas nécessaire. Il devrait être utilisé dans les fichiers .d.ts ou dans des cas similaires.
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;};
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;
}
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);
}
}
Vous pouvez utiliser les éléments suivants:
type
, aliasant un littéral de fonction)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;
// ...
}