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.
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
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: true
y 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).
-
Puedes usar github.com/cexbrayat/angular-cli-diff para verificar muchas cosas, incluido tsconfig
– qdelettre
11 de marzo de 2020 a las 13:00
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.
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
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 entryComponents
todo funcionó bien.
-
¿Qué es Madge? es una herramienta?
– Rebai Ahmed
5 de enero a las 14:49
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
¿Es válido para
return
algo en unconstructor
?– 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