ES6 Классы, которые зависят друг от друга в статических переменных

1

У меня есть два класса, для которых я хочу определить отношения. Я пытаюсь использовать статические переменные для достижения этого, однако ссылки на классы не определены.

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
ecmascript-6
ecma

2 ответа

2
Лучший ответ

Вы просто испытали круговую зависимость. Task нуждается в Checklist и Checklist списке. Task; интерпретатор не может с этим справиться.

Одним из преимуществ было бы использовать оператор get, который задерживает разрешение классов Checklist и Task и устраняет проблему циклической зависимости.

Checklist и Task должны быть разрешены интерпретатором при вызове 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));
  • 1
    Обратите внимание, что поля статического класса из кода OPs даже не будут работать, если два объявления class находятся в одном файле
  • 0
    @ Берги да, ты прав, спасибо. Я обновил свой ответ фрагментом, дающим больше объяснения о рабочем решении.
Показать ещё 4 комментария
0

Я не знаю, можете ли вы сделать это изнутри класса (поскольку то, что вы определили, сначала не будет знать о втором, и, вероятно, также потребуются статические конструкторы). Тем не менее, мне удалось заставить его работать со статическими методами, называемыми после того, как сами классы определены:

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]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню