类型错误:类扩展值未定义不是构造函数或 null

新手上路,请多包涵

在过去的几天里,这个问题一直让我失去理智。

这是我的目录结构:

 [src]
|- cmds/
|  |- Gh.js
|  \- Help.js
|- commands.js
|...

我正在尝试将 commands.js 导出的类导入 Help.jsGh.js (以及我将来可能添加的任何其他文件)。但是,我不断收到错误消息:

 class Gh extends _commands.Command {
                           ^
TypeError: Class extends value undefined is not a constructor or null

所有文件都使用 Babel 转译,将 env 设置为 "node": "current" 并使用 wildcard 包。我试图将它设置为 "browser" 看看它是否是一个过于“高级”的问题,但我得到了关于超级函数(或其他东西)的不同错误,我认为这是同一个问题.

这是从 commands.js 导出的类:

 export class Command {
  constructor (msg) {
    this.id = msg.author.id
    this.msg = msg
  }
  action () {}
  get data () {
    return readData().user[this.id]
  }
  updateUserData (key, val) {
    updateUserData(this.id, key, val)
  }
  sendMsg (data) {
    sendMsg(this.msg, data)
  }
}

…这里是 cmds/Gh.js ,我要导入的文件之一 Command 到:

 import {Command} from '../commands'

export class Gh extends Command {
  constructor (msg) {
    super(msg)
    this.desc = 'Returns GitHub repository link and exits'
  }
  action () {
    this.sendMsg('GitHub link: https://github.com/owm111/knife-wife')
  }
}

我尝试将 Command 放入两个 cmds/ 中,它们运行良好。但是,当将它移回 commands.js 时,它又坏了。我尝试更改从 ../commands ./../commands ../commands.js ./../commands.js 没有工作。我将 commands.js 移动到 cmds/ ,仍然坏了。我试图 console.log(Command) 在两个 cmds/ 中,但他们都返回了 undefined

所有这一切都让它看起来像是进口问题,但我无法弄清楚我的生活是什么。请帮忙。

原文由 Owen McGrath 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 876
1 个回答

如果其他人看到此错误,首先要查找的是 circular dependencies 。将文件 A 导入 B,将 B 导入其他文件 C,依此类推。如果将 C 到 Z 中的任何一个导入到 A 中,那么 JS 将无法确保在另一个文件需要它时定义了一个文件(并且不会尝试返回并稍后填充空白)。

这里很可能就是这种情况,因为显然还有其他代码没有贴出来,而且只有在引入文件依赖项时才会出现。 无论文件结构如何, 问题都存在:保证避免它的唯一结构是一个巨大的 JS 文件。解决方案是确保类之间关系的严格树结构,并使用工厂方法或替代通信(如发射器)来保持耦合松散。

如果您有多个 import / require 语句,我建议定期运行 Madge 之类的检查器,以在循环变得难以撤消之前查找并选择性地可视化任何循环。

 npm install --save-dev madge
node_modules/madge/bin/cli.js --warning --circular --extensions js ./

原文由 MBer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题