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'の型引数は、使用法から推測できません。型引数を明示的に指定することを検討してください。型引数候補 'void'は候補 'string []'のスーパータイプではないため、有効な型引数ではありません。
しかし実際には、then
がvoid
を返すことはありません。
タイプ.then<Promise<any>>
を明示的に指定できますが、これは回避策のようなものであり、適切なソリューションではありません。
これを正しく書くには?
Promise.resolve
およびPromise.reject
insidepromiseチェーンを返さないでください。 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[]>>
としてキャストすると、コンパイラーにユニオンの戻り値の型が通知されます。
@basaratが注記しているように、Promise.rejectを使用する代わりにエラーをスローするだけです(提供されたキャッチハンドラーに渡されます)。