1. ホーム
  2. javascript

[解決済み] TypeError.を修正するには?他のモジュールのクラスを使用する場合、"Type Error: Right-hand side of 'instanceof' is not callable "を修正する方法は?

2022-02-11 20:18:14

質問

別のファイルにあるContextのインスタンスであるかどうかを確認しようとしたが、node jsは以下のようにスローする。 TypeError: Right-hand side of 'instanceof' is not callable.

index.js

const Transaction = require('./Transaction');

class Context {
    constructor(uid) {
        if (typeof uid !== 'string')
            throw new TypeError('uid must be a string.');

        this.uid = uid;
    }

    runTransaction(operator) {
        return new Promise((resolve, reject) => {
            if (typeof operator !== 'function')
                throw new TypeError('operator must be a function containing transaction.');

            operator(new Transaction(this))
        });
    }
}

module.exports = Context;

トランザクション.js

const Context = require('./index');

class Transaction {
    constructor(context) {
        // check type
        if (!(context instanceof Context))
            throw new TypeError('context should be type of Context.');

        this.context = context;
        this.operationList = [];
    }

    addOperation(operation) {

    }
}

module.exports = Transaction;

別のjsファイル

let context = new Context('some uid');
context.runTransaction((transaction) => {
});

そしてそこで、次のように投げます。 TypeError: Right-hand side of 'instanceof' is not callable .

解決方法は?

という問題があります。 循環型依存関係 . もう一方のファイルでは index , index が必要です。 Transaction であり、かつ Transaction が必要です。 index . そのため transaction を実行すると index , そのモジュールはすでにビルドの過程にあります。 . index はまだ何もエクスポートしていないので、その時点でそれを要求すると、空のオブジェクトが生成されます。

どちらもお互いを呼び出す必要があるため、解決する方法の1つは、両方のクラスを一緒にして、両方をエクスポートすることでしょう。

// index.js
class Context {
  constructor(uid) {
    if (typeof uid !== "string") throw new TypeError("uid must be a string.");

    this.uid = uid;
  }

  runTransaction(operator) {
    return new Promise((resolve, reject) => {
      if (typeof operator !== "function")
        throw new TypeError(
          "operator must be a function containing transaction."
        );

      operator(new Transaction(this));
    });
  }
}

class Transaction {
  constructor(context) {
    // check type
    if (!(context instanceof Context))
      throw new TypeError("context should be type of Context.");

    this.context = context;
    this.operationList = [];
    console.log("successfully constructed transaction");
  }

  addOperation(operation) {}
}

module.exports = { Context, Transaction };

そして

const { Context, Transaction } = require("./index");
const context = new Context("some uid");
context.runTransaction(transaction => {});

https://codesandbox.io/s/naughty-jones-xi1q4