Определение типа 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).