У меня есть два класса, для которых я хочу определить отношения. Я пытаюсь использовать статические переменные для достижения этого, однако ссылки на классы не определены.
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];
}
В классе "Задача" контрольный список не определен, и в классе "Контрольный список" задана "Задача", но не так, как я ожидал. Есть ли способ заставить это работать?
Вы просто испытали круговую зависимость. 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));
Я не знаю, можете ли вы сделать это изнутри класса (поскольку то, что вы определили, сначала не будет знать о втором, и, вероятно, также потребуются статические конструкторы). Тем не менее, мне удалось заставить его работать со статическими методами, называемыми после того, как сами классы определены:
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]
class
находятся в одном файле