ES6 类 静态变量中相互依赖

ES6 Classes that depend on each other in static variables

我有两个 class 我想为其定义关系。我正在尝试使用静态变量来实现此目的,但是未定义对 classes 的引用。

import BaseQuery from "../../src/BaseQuery";
import Checklist from "./Checklist";

export default class Task extends BaseQuery {
  static belongsTo = [Checklist];
}

import BaseQuery from "../../src/BaseQuery";
import Task from "./Task";

export default class Checklist extends BaseQuery {
  static hasMany = [Task];
}

在任务 class 中,清单未定义,在清单 class 中,任务已定义,但与我预期的不同。有没有办法让这个工作?

您刚刚经历了循环依赖。 Task 需要 ChecklistChecklist 需要 Task;解释器无法处理。

其中一个解决方案是使用 get operator,这将延迟 ChecklistTask 类 的解析并修复循环依赖问题。

ChecklistTask 必须在调用 belongsTo/hasMany.

时由解释器解析

工作示例 :

class Task {
  static get belongsTo() {
    return [Checklist];
  }

  static get name() {
    return 'Task-class';
  }
}

class Checklist {
  static get hasMany() {
    return [Task];
  }

  static get name() {
    return 'Checklist-task';
  }
}

console.log(Checklist.hasMany.map(x => x.name));

console.log(Task.belongsTo.map(x => x.name));

我不知道您是否可以从 class 内部执行此操作(因为无论您先定义哪个,都不会知道第二个,而且它也可能需要静态构造函数)。但是,我能够让它与在 classes 本身被定义后调用的静态方法一起工作:

class Rubyish{
    static appendProp(propName, value){
        if (!this[propName]) {
            this[propName] = []
        }
        this[propName].push(value)
    }
    static belongsTo(cls){
        this.appendProp('belongsToClasses', cls)
    }
    static hasMany(cls){
        this.appendProp('hasManyClasses', cls)
    }
}

class Task extends Rubyish{
}

class Checklist extends Rubyish{
}

Task.belongsTo(Checklist)
Checklist.hasMany(Task)

编辑添加:这可能有点矫枉过正,因为您可以在没有静态方法的情况下做到这一点:

class NewTask{}
class NewCheckList{}

NewTask.belongsTo = [NewCheckList]

NewCheckList.hasMany = [NewTask]