web-dev-qa-db-fra.com

Définition du type TypeScript pour promise.reject

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?

12
ktretyak

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?
})

Plus

En savoir plus sur le chaînage des promesses https://basarat.gitbooks.io/TypeScript/content/docs/promise.html

11
basarat

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).

3
Ben Southgate