Как исправить «TypeError: Правая часть instanceof не вызывается», когда я использую другой класс модуля? - PullRequest
0 голосов
/ 21 июня 2019

Я попытался проверить тип контекста, является ли он экземпляром Context, который находится в другом файле, но узел 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;

Transaction.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.

1 Ответ

1 голос
/ 21 июня 2019

Проблема в том, что у вас круговая зависимость . Другой файл требует index, index требует Transaction, а Transaction требует index. Таким образом, при запуске transaction он пытается запросить index, , модуль которого уже находится в процессе сборки . index еще ничего не экспортировал, поэтому требование в это время приводит к пустому объекту.

Поскольку оба должны вызывать друг друга, один из способов решить эту проблему - собрать оба класса вместе и экспортировать их оба:

// 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...