Определение типа TypeScript для promise.отклонять

следующий код является правильным с точки зрения типа, который возвращается, потому что then всегда возвращайте массив promise.

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:

аргумент типа для параметра типа "TResult" не может быть выведен из использования. Рассмотрите возможность явного указания аргументов типа. Аргумент типа candidate 'void' не является допустимым аргументом типа, поскольку он не является супертайпом кандидата ' string []'.

но в реальность, then никогда не вернется void.

Я могу явно указать тип .then<Promise<any>>, но это больше похоже на обходной путь, а не на правильное решение.

как это правильно написать?

2 ответов


вы не должны возвращать Promise.resolve и Promise.reject внутри цепи обещание. The resolve должен управляться простым возвратом и reject должен управляться явным 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?
})

больше

подробнее о цепочке обещаний https://basarat.gitbooks.io/typescript/content/docs/promise.html


Typescript жалуется на разницу в типе возврата между вашим Promise.reject возвращаемое значение (Promise<void>) и Promise.resolve значение (Promise<string[]>).

кастинг then называй как .then<Promise<void | string[]>> сообщит компилятору о типе возврата union.

как отмечает @basarat, вы должны просто бросить ошибку вместо использования Promise.отклонить (который будет передан любому обработчику catch).