Javascript 阶段3循环依赖性问题 如何解决Phaser 3中的循环依赖关系 背景

Javascript 阶段3循环依赖性问题 如何解决Phaser 3中的循环依赖关系 背景,javascript,typescript,phaser-framework,circular-dependency,Javascript,Typescript,Phaser Framework,Circular Dependency,我正在用Phaser3,打字脚本和包裹做一个游戏。我添加了一些类,这些类实现了一些接口,但是这些接口相互导入和使用。我开始在airbnb规则集中使用eslint。他们执行的规则之一是导入/不循环,但我觉得我的游戏需要它 示例代码 GameInterface.ts 从'phaser'导入{Scene}; 从“../../entities/player/PlayerInterface”;/”导入PlayerInterface圆形的 界面游戏界面扩展场景{ 玩家:玩家界面; } 导出默认游戏界面;

我正在用Phaser3,打字脚本和包裹做一个游戏。我添加了一些类,这些类实现了一些接口,但是这些接口相互导入和使用。我开始在airbnb规则集中使用eslint。他们执行的规则之一是导入/不循环,但我觉得我的游戏需要它

示例代码 GameInterface.ts
从'phaser'导入{Scene};
从“../../entities/player/PlayerInterface”;/”导入PlayerInterface圆形的
界面游戏界面扩展场景{
玩家:玩家界面;
}
导出默认游戏界面;
PlayerInterface.ts
从“../../scenes/game/GameInterface”导入游戏界面;//圆形的
界面播放器接口扩展Phaser.Physics.Arcade.Sprite{
场景:游戏界面;
速度:数字;
}
导出默认PlayerInterface;
问题: “玩家”被添加到“游戏”中,玩家类有一个场景。所以它们都需要在接口中。由于这只是一个类型文件,我可以忽略此规则吗?或者我能做一个切肉刀重组吗

编辑1 此外,还提供了完整回购协议的链接

编辑2 下面是实现这些接口的两个类

Game.ts
类游戏扩展场景实现游戏界面{
玩家:玩家界面;
构造函数(){
超级({
关键:“游戏”,
});
}
预加载():无效{
/*预加载代码*/
}
create():void{
/*创建代码*/
}
}
Player.ts
class Player扩展Phaser.Physics.Arcade.Sprite实现PlayerInterface{
场景:游戏界面;
构造器(场景:游戏界面){
超级(场景,x,y,‘玩家’);
这个场景=场景;
this.scene.add.existing(this);
this.scene.physics.add.existing(this);
}
静态预加载(场景:游戏界面):无效{
/*预载*/
}
}

正如您所看到的,游戏类创建了玩家,但玩家在创建时也会传递一个场景。

所有循环依赖的第一个表示当您有两个类
a
&
B

  • A
    使用类
    B
    ,因此
    A
    依赖于
    B
  • Class
    B
    使用Class
    A
    ,因此
    B
    也依赖于
    A
结果,在初始化这两个类时,它将抛出一个无限循环,因为它希望基于B创建类A,而该类希望基于类A创建,尽管它进入了有益循环

因此,只需减少不必要的依赖

  • 因此,在
    游戏
    类中,似乎不需要使用
    玩家界面
  • 而且你不需要在你的界面中扩展
    场景
    相位器、物理、拱廊、精灵
    。因为您已经在具体的类中扩展了它们。把它们取下来

  • 将两个接口放在同一个文件中。这将利用循环文件加载,这正是让您感到困惑的地方。

    您可以尝试将两个接口放在同一个文件中吗?我不确定您的逻辑是否正确。这里您描述了一个无限递归javascript对象,它看起来是这样的:
    player={scene:{player:{scene:{player:…}}}
    。你真的操纵这种类型的对象吗?为什么不把接口放在一个文件中呢?你应该设计你的应用程序,使其中一个接口不需要另一个接口。循环依赖关系只来自我的接口。我在每门课上都使用玩家和游戏。我只是不在这里的代码中显示它们,因为它夸大了问题。虽然我将测试从界面中删除场景和精灵,但我觉得它之前给了我错误。仅供参考,从扩展中删除场景/精灵是不好的。如果我删除这个接口,它们并不代表它是什么。如果我将其从类中删除,它将不起作用,因为intreface的实现不正确。这不是一个可伸缩的解决方案