1. ホーム
  2. javascript

[解決済み] switch文でのinstanceofの使い方

2023-07-08 03:16:11

質問

私は、カスタムエラー( es6-error ) を使っていて、このようにクラスに基づいてエラーを処理することができます。

import { DatabaseEntryNotFoundError, NotAllowedError } from 'customError';

function fooRoute(req, res) {
  doSomethingAsync()
    .then(() => {
      // on resolve / success
      return res.send(200);
    })
    .catch((error) => {
      // on reject / failure
      if (error instanceof DatabaseEntryNotFoundError) {
        return res.send(404);
      } else if (error instanceof NotAllowedError) {
        return res.send(400);
      }
      log('Failed to do something async with an unspecified error: ', error);
      return res.send(500);
    };
}

さて、このような流れでスイッチを使いたいところですが、結果的には以下のようになります。

import { DatabaseEntryNotFoundError, NotAllowedError } from 'customError';

function fooRoute(req, res) {
  doSomethingAsync()
    .then(() => {
      // on resolve / success
      return res.send(200);
    })
    .catch((error) => {
      // on reject / failure
      switch (error instanceof) {
        case NotAllowedError:
          return res.send(400);
        case DatabaseEntryNotFoundError:
          return res.send(404);
        default:
          log('Failed to do something async with an unspecified error: ', error);
          return res.send(500);
      }
    });
}

インスタンスオブ はそのように動作しません。ですから、後者は失敗します。

switch文の中でインスタンスのクラスをチェックする方法はありますか?

どのように解決するのですか?

良い選択肢は constructor プロパティ オブジェクトの

// on reject / failure
switch (error.constructor) {
    case NotAllowedError:
        return res.send(400);
    case DatabaseEntryNotFoundError:
        return res.send(404);
    default:
        log('Failed to do something async with an unspecified error: ', error);
        return res.send(500);
}

constructor はオブジェクトが作成されたものと完全に一致しなければならないことに注意してください (仮に error のインスタンスであるとします。 NotAllowedError であり NotAllowedError のサブクラスです。 Error ):

  • error.constructor === NotAllowedErrortrue
  • error.constructor === Errorfalse

とは異なります。 instanceof とは異なり、スーパークラスにもマッチします。

  • error instanceof NotAllowedErrortrue
  • error instanceof Errortrue

チェック この興味深い記事 について constructor プロパティを指定します。