Декоратор: не может получить доступ к «xxx» до инициализации - PullRequest
0 голосов
/ 11 апреля 2020

Я не уверен, как решить эту проблему, но я получаю сообщение об ошибке:

Uncaught ReferenceError: Невозможно получить доступ к «игре» до инициализации

Итак Я пытался сделать свойства и методы stati c, но ничего не сделал. Что я могу сделать, чтобы добавить декораторы к классам, которые добавляют элемент в мое свойство registeredComponents в классе Game?

Основная точка входа библиотеки выглядит следующим образом:

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

Игровой компонент создает экземпляр 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
  }
}

Здесь я использую свой декоратор для Transform:

@Component()
export class Transform extends Behavior {
  public position: Vector3 = Vector3.zero
}

Вот так выглядит декоратор :

export function Component() {
  return (target: typeof Behavior): void => {
    game.registerComponent(target)
  }
}

Использование

В другом проекте, который я использую для использования этой библиотеки, он выглядит следующим образом:

import { game, PrefabUtil } from 'gameengine'

class Item extends PrefabUtil { }

game.instantiate(Item)

1 Ответ

0 голосов
/ 11 апреля 2020

Итак ... Похоже, что для этого мне нужно использовать динамику c import(). Это будет задерживать вызов к декоратору до тех пор, пока не будет создан объект Game.

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'
...