Angular: 7.2.1 clase ES6 ReferenceError: no se puede acceder a ‘X’ antes de la inicialización

5 minutos de lectura

Avatar de usuario de Olivier MATROT
Olivier MATROT

Tengo la siguiente clase de TypeScript

export class Vehicule extends TrackableEntity {
  vehiculeId: number;
  constructor() {
    super();
    return super.proxify(this);
  }
}

mi destino mecanografiado en tsconfig.json está configurado como es6:

"compilerOptions": {
    "module": "es2015",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es6",
}

En tiempo de ejecución, aquí en Chrome, el código falla con:

ReferenceError: Cannot access 'Vehicule' before initialization
    at Module.Vehicule (https://localhost:44338/src-app-components-dispositifsDATI-dispositifsDATI-module.js:10559:100)
    at Module../src/app/domain/models/VehiculeGpsBoxInfo.ts (https://localhost:44338/src-app-components-dispositifsDATI-dispositifsDATI-module.js:11156:69)
    at __webpack_require__ (https://localhost:44338/runtime.js:84:30)
    at Module../src/app/domain/models/Vehicule.ts (https://localhost:44338/src-app-components-dispositifsDATI-dispositifsDATI-module.js:10571:78)
    at __webpack_require__ (https://localhost:44338/runtime.js:84:30)
    at Module../src/app/components/dispositifsDATI/mainDATI/listDATI/listDATI.component.ts (https://localhost:44338/src-app-components-dispositifsDATI-dispositifsDATI-module.js:6447:82)
    at __webpack_require__ (https://localhost:44338/runtime.js:84:30)
    at Module../src/app/components/dispositifsDATI/index.ts (https://localhost:44338/src-app-components-dispositifsDATI-dispositifsDATI-module.js:3053:95)
    at __webpack_require__ (https://localhost:44338/runtime.js:84:30)
    at Module../src/app/components/dispositifsDATI/dispositifsDATI.routes.ts (https://localhost:44338/src-app-components-dispositifsDATI-dispositifsDATI-module.js:2982:64)

Necesitaba cambiar es5 a es6 para resolver este otro problema.


EDITAR: El archivo VehiculeGpsBoxInfo.ts está importando Vehicule de esta manera:

import { Vehicule } from "./Vehicule";

EDICIÓN 2: diría que esto puede estar relacionado con el paquete web, la forma en que los módulos se exportan/importan en los módulos generados.

EDIT 3: Después de más investigaciones, esto parece no tener nada que ver con el código que se muestra arriba. Comenzó una nueva pregunta sobre webpack y ES6.

  • ¿Es válido para return algo en un constructor?

    – jlang

    31 de octubre de 2019 a las 10:08


  • @jlang Por favor mira esto

    –Olivier MATROT

    31 oct 2019 a las 10:32

  • Tuve este problema y descubrí que a un servicio que estaba inyectando le faltaban proveedores. Revisa tu árbol

    – Politerativo

    11 de mayo de 2022 a las 12:16

Recibí este error debido a una dependencia circular, como

  • A inyectado con B
  • B inyectado con C
  • C inyectado con A

La eliminación de la dependencia circular solucionó este error.

  • ¿Te importaría explicar por qué el -1? gracias

    – Wesley Gonçalves

    2 de noviembre de 2020 a las 19:27

  • Esto es definitivamente relevante y me ayudó a resolver mi problema. En mi caso tenía un servicio S provisto por ModuleA, usado internamente y por ModuleB (que no importaba ModuleA). Este no era el problema, sino que el servicio S debería haberlo proporcionado ModuleC.

    – Gui Brunow

    10 de noviembre de 2020 a las 23:55


  • También tenía una dependencia circular. Una vez que lo arreglé, todo volvió a estar bien. Gracias

    – LeonardoX

    13 de septiembre de 2021 a las 7:58

  • Esta debería ser la respuesta correcta. salva mi vida gracias bruh

    – deanwilliammills

    13 de abril de 2022 a las 12:32

Avatar de usuario de John
John

Probablemente te encuentres con este problema de Angular: https://github.com/angular/angular-cli/issues/15077.

De ese problema:

Hola, ¿hay alguna razón por la que necesite emitDecoratorMetadata para ser verdad?

Esta opción de TypeScript tiene una limitación de diseño fundamental con el código ES2015+ y es mejor evitarla al apuntar a dicha salida. Como tal, este es un problema con TypeScript en sí mismo y no con Angular.

Angular 8+ ya no requiere la opción. Anteriormente, solo se requería para el modo JIT, que generalmente solo se usa en desarrollo.

La solución es establecer "emitDecoratorMetadata": false en su archivo tsconfig.json.

Nota al margen:
Debo decir, dado que las versiones anteriores de Angular CLI agregaron automáticamente emitDecoratorMetadata: truey no hay ninguna razón por la que pueda ver por qué un desarrollador debería saber eso emitDecoratorMetadata ahora debería ser false, es bastante horrible que el equipo de Angular básicamente dijera “este no es nuestro problema” y cerró el problema sin acción. Esto podría haberse “arreglado” fácilmente agregando una mejor documentación (como lo señaló alguien en el problema vinculado).

Avatar de usuario de Shorn
rapado

Tenga en cuenta que este error también puede ser causado por la definición de dos públicos @Injectable clases dentro del mismo .ts expediente.

Me he tropezado con esto más de una vez cuando solo estoy creando prototipos localmente (especialmente cuando refactorizo ​​un servicio en varios).

Entorno emitDecoratorMetadata: false soluciona esta situación también; pero en caso de que tenga prisa por arreglar algo o no quiera jugar con eltsconfig.json archivo en un proyecto grande: es útil saber que es posible que pueda solucionarlo simplemente moviendo una de las clases a un nuevo archivo.

  • Wow, me salvaste la vida, tuve el problema y se debió a una inyección pública dentro del archivo .ts del componente.

    – Logan Wlv

    18 de agosto de 2022 a las 15:59

  • Sí, culpable. Uhlala.

    – Théo T. Carranza

    23 de enero a las 9:15

Me encontré con esto debido al orden de mis declaraciones de importación en el módulo. Un archivo que también accedió al componente tuvo que ser importado antes que el componente.

avatar de usuario de user1568220
usuario1568220

para encontrar dependencias circulares:

npx madge –circular –extensiones ts ./

(construir antes)

  • ¿Qué es Madge? es una herramienta?

    – Rebai Ahmed

    5 de enero a las 14:49

Avatar de usuario de Hadrien TOMA
Hadrien TOMA

En Angular 8, teniendo entryComponents declarado como una lista vacía en un SharedModule me causó este problema:

entryComponents: []

Después de quitar entryComponentstodo funcionó bien.

  • ¿Qué es Madge? es una herramienta?

    – Rebai Ahmed

    5 de enero a las 14:49

Avatar de usuario de Hamidreza Vakilian
hamidreza vakilian

¡La dependencia circular es el diablo!

Hace que el compilador no pueda resolver todo el bucle de dependencia. En la mayoría de los casos, los errores parecen que no está importando las clases en absoluto.

Algunos podrían pensar que las dependencias circulares solo deben evitarse en servicios y módulos. Sin embargo, la dependencia circular debe evitarse en todas las formas, incluso en modelos, componentes y clases.

Cuando tiene una dependencia circular, es una señal de que (tarde o temprano) necesita refactorizar y reestructurar su código. Los siguientes consejos pueden ser útiles para hacerlo. Supongamos que queremos eliminar la dependencia circular entre dos clases A, B.

Solución 1: unión/fusión

A y B siguen el mismo concepto y se pueden fusionar en una sola clase.

Solución 2: Separación/Creación

Debería haber una nueva clase C, en la que tanto A como B dependan o se sitúe en algún lugar entre esos dos.

Según mi experiencia, en la mayoría de los casos, la dependencia circular ocurre porque el desarrollador tiende a fusionar n lógicas en k (k

  • es por eso que todos están abandonando angular

    – Dina moscas

    6 de enero a las 12:58

  • @DinaFlies Las dependencias circulares entre módulos se consideran un antipatrón debido a sus efectos negativos independientemente de la plataforma. Entonces no se trata de angular o de una plataforma específica.

    –Hamidreza Vakilian

    7 ene a las 12:38

  • Me perdí la parte en la que mencioné las dependencias circulares. Si bien angular tiene una complejidad adicional para manejar módulos, otros marcos simplemente importan sus componentes donde se necesitan.

    – Dina moscas

    7 ene a las 17:25

¿Ha sido útil esta solución?