2016-09-08 3 views
6

Следующий код верен с точки зрения возвращаемого типа, поскольку then всегда возвращает массив обещаний.Определение типа типа для prom.reject

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

машинопись ошибка броска:

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[]'.

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

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

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

ответ

6

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

+2

В качестве лучшей практики, конечно, вы правы, но в то же время, нет никаких причин, почему вы не могли вернуться 'Promise.resolve () 'и/или' Promise.reject() 'из обработчика' then', и у OP есть законный вопрос относительно того, почему TypeScript недовольна этим. –

2

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

Кастинг then звонок как .then<Promise<void | string[]>> позволит компилятору узнать тип возврата объединения.

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

Смежные вопросы