Javascript 装饰程序:在初始化之前无法访问“xxx”

Javascript 装饰程序:在初始化之前无法访问“xxx”,javascript,typescript,typescript-decorator,Javascript,Typescript,Typescript Decorator,我不知道如何解决这个问题,但我得到一个错误,它说: 未捕获引用错误:初始化前无法访问“游戏” 因此,我尝试将属性和方法设置为静态,但没有任何效果。如何向类中添加装饰器,以便在游戏类中将项目添加到我的registeredComponents属性中 库的主要入口点如下所示: import { Game } from './Game' export const game = new Game import { game, PrefabUtil } from 'gameengine' class I

我不知道如何解决这个问题,但我得到一个错误,它说:

未捕获引用错误:初始化前无法访问“游戏”

因此,我尝试将属性和方法设置为静态,但没有任何效果。如何向类中添加装饰器,以便在游戏类中将项目添加到我的registeredComponents属性中

库的主要入口点如下所示:

import { Game } from './Game'
export const game = new Game
import { game, PrefabUtil } from 'gameengine'

class Item extends PrefabUtil { }

game.instantiate(Item)
游戏组件创建Transform实例并将其添加到其内部列表:

import { Transform } from './core/components/Transform'

export class Game {
  private registeredComponents: Set<typeof Behavior> = new Set<typeof Behavior>()

  public registerComponent(component: typeof Behavior): void {
    this.registeredComponents.add(component)
  }

  public instantiate() {
    const gameObject = new GameObject()
    const transform = new Transform(gameObject)
    // Do some other stuff
  }
}
这就是装饰师的样子:

export function Component() {
  return (target: typeof Behavior): void => {
    game.registerComponent(target)
  }
}
用法 在我使用此库的另一个项目中,它看起来如下所示:

import { Game } from './Game'
export const game = new Game
import { game, PrefabUtil } from 'gameengine'

class Item extends PrefabUtil { }

game.instantiate(Item)

所以。。。看起来要做到这一点,我需要使用动态导入。这将延迟对装饰器的调用,直到创建游戏对象之后

export class Game {
  public async instantiate() {
    const Transform = (await import('./core/components/Transform')).Transform
    const transform = new Transform(gameObject)
  }
}
还需要拆下以下线路:

import { Transform } from './core/components/Transform'

所以。。。看起来要做到这一点,我需要使用动态导入。这将延迟对装饰器的调用,直到创建游戏对象之后

export class Game {
  public async instantiate() {
    const Transform = (await import('./core/components/Transform')).Transform
    const transform = new Transform(gameObject)
  }
}
还需要拆下以下线路:

import { Transform } from './core/components/Transform'

有一个循环依赖项索引->游戏->转换->组件->游戏,它不是一个循环依赖项,除非游戏是在组件中导出的,而它不是。您的装饰者使用游戏实例。Game类使用用上述装饰器装饰的Transform类。Decorator在导入时评估模块时应用,而不是在创建新实例时应用Transform@Shlang,事实上这是真的,但很好。正如您所说,在模块求值时调用decorator,但抛出的不是decorator,而是它返回的函数。函数组件不是decorator,它是一个decorator工厂,因此在应用它时需要添加它,它返回的函数是一个真正的decorator,在评估模块时调用它。请检查是否存在循环依赖项索引->游戏->转换->组件->游戏,该索引不是循环依赖项,除非游戏是在组件中导出的,而该组件不是。您的装饰者使用游戏实例。Game类使用用上述装饰器装饰的Transform类。Decorator在导入时评估模块时应用,而不是在创建新实例时应用Transform@Shlang,事实上这是真的,但很好。正如您所说,在模块求值时调用decorator,但抛出的不是decorator,而是它返回的函数。函数组件不是decorator,它是一个decorator工厂,因此在应用它时需要添加它,它返回的函数是一个真正的decorator,在评估模块时调用它。请检查一下,当Javascript的灵活性可能是负面的时候,就是这样的时候了。您的错误是由@Shlang提到的循环依赖项引起的,循环依赖项表明您的体系结构中存在问题。你已经找到了一个骇人的解决方案,它可以让你随心所欲地工作,但它很可能会在以后的日子里给你带来无尽的悲伤。请再看一次,看看你是否能以不同的方式构造代码,在没有黑客攻击的情况下仍能实现你想要的,从长远来看,这将为你节省大量的时间和问题!在这种情况下,Javascript的灵活性可能是负面的。您的错误是由@Shlang提到的循环依赖项引起的,循环依赖项表明您的体系结构中存在问题。你已经找到了一个骇人的解决方案,它可以让你随心所欲地工作,但它很可能会在以后的日子里给你带来无尽的悲伤。请再看一次,看看你是否能以不同的方式构造代码,在没有黑客攻击的情况下仍能实现你想要的,从长远来看,这将为你节省大量的时间和问题!