ktretyak ktretyak - 2 months ago 13
TypeScript Question

TypeScript type definition for promise.reject

The following code is correct in terms of the type that is returned, because

then
always return the promise array.

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


TypeScript throw error:


The type argument for type parameter 'TResult' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidate 'void' is not a valid type argument because it is not a supertype of candidate 'string[]'.


But in reality,
then
never will return
void
.

I can explicitly specify type
.then<Promise<any>>
, but it's more like a workaround, not the right solution.

How to write this right?

Answer

You should not return Promise.resolve and Promise.reject inside a promise chain. The resolve should be driven by simple return and reject should be driven by an explicit 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?
})

More

More on promise chaining https://basarat.gitbooks.io/typescript/content/docs/promise.html

Comments