【対処方法】[ESLint]Promises must be handled appropriately or explicitly marked as ignored with the `void` operator


スポンサーリンク

エラー内容

TypeScriptでasync/awaitを使った基本的な非同期処理を行っているのですが、TSLintが以下の2つの関数に対して謎のエラーメッセージを投げてきます。

誰かこのようなエラーに遭遇したことはありますか?

エラー出力ではルールが言及されていないので、何が原因なのか理解できません。

何かアイデアがあれば、非常にありがたいです。

import * as rp from 'request-promise'

export function getRequest(address: rp.Options): rp.RequestPromise {
  return rp(address)
}
export async function getStatus(message: Message) {
  try {
    const res = await getRequest(address)
    if (res.ready) {
      message.reply('...')
    } else {
      message.reply('...')
    }
  } catch (err) {
    message.reply(err)
  }
}

これは得です。プロミスは適切に処理されなければならず、3行目の非プロミスの待ち受けになります。

このエクスポートを使用する単純な関数は以下です。

client.on('message', message => {
  if (message.content === 'green') {
    getStatus(message)
  }
})

これは、プロミスが適切に処理されなければならないことを意味します。

回答

これはひどいエラーメッセージです。もっと良いものは、次のようなものです。

Promise型のすべての式は、.catchまたは.thenの呼び出しと拒否ハンドラで終わらなければなりません。

PromiseFunction()
  .catch(err => handle(err))
  .then(() => console.log('this will succeed'))

というのも、.then(...)の型は約束であり、catchで終わらなければならないからです。修正方法は、例えば、.catch節を追加することです。

PromiseFunction()
  .catch(err => handle(err))
  .then(() => console.log('this will succeed'))
  .catch(() => 'obligatory catch')

または、そのラインを経由して tslint を無効にします。

PromiseFunction()
  .catch(err => handle(err))
  // tslint:disable-next-line:no-unsafe-any
  .then(() => console.log('this will succeed')