Hier, j'ai décidé de jouer avec le dactylographe et j'ai essayé de porter des exemples de promesse javascript de base vers des promesses dactylographiées. Mais, lors du portage des échantillons, j'ai rencontré un problème que je n'arrivais toujours pas à résoudre. J'ai essayé de le googler aussi sans utilité.

Scénario : J'ai une fonction qui renvoie un Promise qui lors de l'exécution se résout en un number. Je voulais également tester certains scénarios then sur cet exemple.

Veuillez trouver l'exemple de code ci-dessous :

function test_promise(): Promise<number>{
    return new Promise((resolve, reject) :number => {
        let result:number = 10;
        resolve(result);
    }).then(result => {            // first then
        console.log("Result: " + (typeof result)); // Result: number
        return result * 2; //
    }).then(result => {            // second then
        return result * 2;
    }).then(result => {            // third then
        return result * 2;
    });
}

J'ajoute également deux captures d'écran pour plus de clarté.

Capture d'écran 1:

enter image description here

Capture d'écran 2

enter image description here

Il y a deux ou trois choses qui ne sont pas claires pour moi pour le moment :

  1. Dans la capture d'écran 1, l'élément d'indice ne dit pas que le résultat typeof est number, mais lors de l'impression dans console.log, il dit que c'est un number. Quelle est la différence?
  2. S'il affiche dans la console qu'il s'agit d'un number, alors pourquoi cela ne me permet pas d'effectuer une opération de multiplication sur cela.

Que dois-je changer ici pour que cet exemple fonctionne ?

Puissiez-vous les gars nous éclairer un peu. Merci.

Cordialement,

1
mj.scintilla 14 mars 2019 à 12:49

2 réponses

Meilleure réponse

La solution ici consiste à spécifier explicitement le type de valeur du premier objet Promise que vous instanciez, en ajoutant <number> directement après new Promise comme indiqué :

    /* Add <number> after new Promise */
    return new Promise<number>((resolve, reject) => {
        let result:number = 10;
        resolve(result);
    }).then(result => {            // first then
        console.log("Result: " + (typeof result)); // Result: number
        return result * 2; //
    }).then(result => {            // second then
        return result * 2;
    }).then(result => {            // third then
        return result * 2;
    });

Cela informe Typescript du type de valeur de la première promesse, ce qui permet de déduire le type de valeur des promesses suivantes dans la chaîne.

Cela résoudra à son tour votre problème. Plus d'informations sur Les génériques dans Typescript peuvent être trouvés ici. J'espère que cela pourra aider!

3
Dacre Denny 14 mars 2019 à 09:53

Vérifiez la ligne suivante:

return new Promise((resolve, reject) :number => {

: number signifie que la fonction (ou le constructeur, ce qui a encore moins de sens) renvoie un nombre. Ce n'est pas vrai! new Promise renvoie évidemment une promesse, et vous n'avez pas à le spécifier.

Ce que tu voulais dire, peut-être, c'est que le type manipulé par Promise est un nombre. Vous pouvez le faire en utilisant des parenthèses angulaires :

return new Promise<number>((resolve, reject) => {
0
Cristian Traìna 14 mars 2019 à 10:06