web-dev-qa-db-ja.com

promise.rejectのTypeScriptタイプ定義

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 []'のスーパータイプではないため、有効な型引数ではありません。

しかし実際には、thenvoidを返すことはありません。

タイプ.then<Promise<any>>を明示的に指定できますが、これは回避策のようなものであり、適切なソリューションではありません。

これを正しく書くには?

12
ktretyak

Promise.resolveおよびPromise.rejectinsidepromiseチェーンを返さないでください。 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

11
basarat

TypeScriptは、Promise.rejectの戻り値(Promise<void>)とPromise.resolveの値(Promise<string[]>)の戻り値の型の違いについて不平を言っています。

then呼び出しを.then<Promise<void | string[]>>としてキャストすると、コンパイラーにユニオンの戻り値の型が通知されます。

@basaratが注記しているように、Promise.rejectを使用する代わりにエラーをスローするだけです(提供されたキャッチハンドラーに渡されます)。

3
Ben Southgate