Le code suivant est correct en termes de type renvoyé, car then
renvoie toujours le tableau de promesses.
Promise.resolve(['one', 'two'])
.then( arr =>
{
if( arr.indexOf('three') === -1 )
return Promise.reject( new Error('Where is three?') );
return Promise.resolve(arr);
})
.catch( err =>
{
console.log(err); // Error: where is three?
})
Erreur de lancement TypeScript:
L'argument de type pour le paramètre de type "TResult" ne peut pas être déduit de l'utilisation. Pensez à spécifier explicitement les arguments de type. L'argument de type candidat 'void' n'est pas un argument de type valide car il ne s'agit pas d'un sur-type de candidat 'string []'.
Mais en réalité, then
ne retournera jamais void
.
Je peux explicitement spécifier le type .then<Promise<any>>
, mais c'est plutôt une solution de contournement, pas la bonne solution.
Comment écrire ça correctement?
Vous ne devez pas retourner Promise.resolve
et Promise.reject
à l'intérieur d'une chaîne de promesses. resolve
doit être piloté par un simple retour et reject
doit être piloté par un throw new Error
.
Promise.resolve(['one', 'two'])
.then( arr =>
{
if( arr.indexOf('three') === -1 )
throw new Error('Where is three?');
return arr;
})
.catch( err =>
{
console.log(err); // Error: where is three?
})
En savoir plus sur le chaînage des promesses https://basarat.gitbooks.io/TypeScript/content/docs/promise.html
TypeScript se plaint de la différence de type de retour entre votre Promise.reject
valeur de retour (Promise<void>
) et ton Promise.resolve
valeur (Promise<string[]>
).
Transférer votre appel then
en tant que .then<Promise<void | string[]>>
indiquera au compilateur le type de retour d'union.
comme le note @basarat, vous devez simplement lancer une erreur au lieu d'utiliser Promise.reject (qui sera transmise au gestionnaire de captures fourni).