Angular: 7.2.1 ES6-Klasse ReferenceError: Auf „X“ kann vor der Initialisierung nicht zugegriffen werden

Lesezeit: 6 Minuten

Olivier MATROTs Benutzeravatar
Olivier MATROT

Ich habe die folgende TypeScript-Klasse

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

Mein TypeScript-Ziel in tsconfig.json ist als es6 konfiguriert:

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

Zur Laufzeit, hier in Chrome, schlägt der Code fehl mit:

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)

Ich musste es5 in es6 ändern, um dieses andere Problem zu lösen.


BEARBEITEN: Die Datei VehiculeGpsBoxInfo.ts importiert Fahrzeuge wie folgt:

import { Vehicule } from "./Vehicule";

EDIT 2: Ich würde sagen, dass dies möglicherweise mit dem Webpack zusammenhängt, der Art und Weise, wie Module in den generierten Modulen exportiert/importiert werden.

EDIT 3: Nach weiteren Recherchen scheint dies nichts mit dem oben gezeigten Code zu tun zu haben. Habe eine neue Frage zu Webpack und ES6 gestartet.

  • Ist es gültig? return etwas in einem constructor?

    – jlang

    31. Okt. 2019 um 10:08


  • @jlang Bitte sehen Sie sich das an

    – Olivier MATROT

    31. Okt. 2019 um 10:32 Uhr

  • Ich hatte dieses Problem und fand heraus, dass bei einem Dienst, den ich injizierte, einige Injektionsanbieter fehlten. Überprüfen Sie Ihren Baum

    – Polyterativ

    11. Mai 2022 um 12:16 Uhr

Ich habe diesen Fehler aufgrund einer zirkulären Abhängigkeit erhalten

  • A mit B injiziert
  • B mit C injiziert
  • C mit A injiziert

Durch das Entfernen der zirkulären Abhängigkeit wurde dieser Fehler behoben.

  • Das ist auf jeden Fall relevant und hat mir geholfen, mein Problem herauszufinden. In meinem Fall hatte ich einen von ModulA bereitgestellten Dienst S, der intern und von ModulB verwendet wurde (der ModulA nicht importierte). Das war nicht ganz das Problem, sondern vielmehr, dass der Dienst S stattdessen von ModuleC hätte bereitgestellt werden sollen.

    – Gui Brunow

    10. November 2020 um 23:55 Uhr


  • Ich hatte auch eine zirkuläre Abhängigkeit. Nachdem ich das Problem behoben hatte, war alles wieder in Ordnung. Danke

    – LeonardoX

    13. September 2021 um 7:58

  • Das war auch bei mir der Fall, danke!

    – Guillaume Martin

    25. April um 8:37 Uhr

Johns Benutzeravatar
John

Sie stoßen wahrscheinlich auf dieses Angular-Problem: https://github.com/angular/angular-cli/issues/15077.

Aus dieser Ausgabe:

Hallo, gibt es einen Grund, warum emitDecoratorMetadata wahr sein muss?

Diese TypeScript-Option weist eine grundlegende Designbeschränkung bei ES2015+-Code auf und sollte bei der Ausrichtung auf eine solche Ausgabe am besten vermieden werden. Daher handelt es sich hier um ein Problem mit TypeScript selbst und nicht mit Angular.

Angular 8+ erfordert diese Option nicht mehr. Bisher war es auch nur für den JIT-Modus erforderlich, der normalerweise nur in der Entwicklung verwendet wird.

Die Lösung ist zu setzen "emitDecoratorMetadata": false in Ihrer tsconfig.json-Datei.

Randnotiz:
Ich muss sagen, dass frühere Versionen der Angular-CLI automatisch hinzugefügt wurden emitDecoratorMetadata: trueund es gibt keinen Grund, warum ein Entwickler das wissen sollte emitDecoratorMetadata sollte jetzt sein falseEs ist ziemlich schrecklich, dass das Angular-Team im Grunde gesagt hat: „Das ist nicht unser Problem“ und das Problem ohne Maßnahmen abgeschlossen hat. Dies hätte durch Hinzufügen einer besseren Dokumentation leicht „behoben“ werden können (wie von jemandem in der verlinkten Ausgabe hervorgehoben).

Shorns Benutzeravatar
Geschoren

Beachten Sie, dass dieser Fehler auch durch die Definition von zwei öffentlichen verursacht werden kann @Injectable Klassen innerhalb derselben .ts Datei.

Ich bin mehr als einmal darüber gestolpert, als ich nur lokal Prototypen erstellte (insbesondere, wenn ich einen Dienst in mehrere umgestaltete).

Einstellung emitDecoratorMetadata: false behebt auch diese Situation; Aber für den Fall, dass Sie es eilig haben, etwas zu reparieren, oder keine Lust haben, damit herumzuspielentsconfig.json Datei in einem großen Projekt – es ist nützlich zu wissen, dass Sie das Problem möglicherweise beheben können, indem Sie einfach eine der Klassen in eine neue Datei verschieben.

  • Wow, du hast mir das Leben gerettet, ich hatte das Problem und es lag an einer öffentlichen Injektion innerhalb der .ts-Datei der Komponente.

    – Logan Wlv

    18. August 2022 um 15:59 Uhr

  • Ja, schuldig. Uhlala.

    – Théo T. Carranza

    23. Januar um 9:15 Uhr

Benutzeravatar von user1568220
Benutzer1568220

um zirkuläre Abhängigkeiten zu finden:

npx madge –circular –extensions ts ./

(vorher bauen)

Ich bin aufgrund der Reihenfolge meiner Importanweisungen im Modul darauf gestoßen. Vor der Komponente musste eine Datei importiert werden, die auch auf die Komponente zugreift.

  • Das war es für mich. Vielen Dank, dass Sie dies in die Antworten geworfen haben!

    – tuffant21

    30. August 2022 um 19:07 Uhr

  • Das war es für mich. In meinem Fall habe ich im VS-Code die Verknüpfung „Importe organisieren“ vorgenommen und einige Dienste wurden vor der AppComponent in main.ts importiert. Das Problem wurde dadurch gelöst, dass AppComponent zuerst angezeigt wurde.

    – aosaimy

    25. April um 22:13

  • Das hat mir geholfen, obwohl in meinem Fall die Fehlerquelle in meiner Bibliothek lag und ich einfach die Direktive, die den Fehler verursachte, an den Anfang ihrer Datei verschoben habe. Ich wette, ich hätte auch die Exportreihenfolge in den public-api.ts ändern können. Ich kann nicht glauben, dass es funktioniert hat … scheint flockig zu sein.

    – AndrewBenjamin

    30. April um 15:29

Benutzeravatar von Hadrien TOMA
Hadrien TOMA

In Angular 8, mit entryComponents als leere Liste in einem SharedModule deklariert, verursachte bei mir dieses Problem:

entryComponents: []

Nach dem Entfernen entryComponentsalles hat gut funktioniert.

  • Das war es für mich. Vielen Dank, dass Sie dies in die Antworten geworfen haben!

    – tuffant21

    30. August 2022 um 19:07 Uhr

  • Das war es für mich. In meinem Fall habe ich im VS-Code die Verknüpfung „Importe organisieren“ vorgenommen und einige Dienste wurden vor der AppComponent in main.ts importiert. Das Problem wurde dadurch gelöst, dass AppComponent zuerst angezeigt wurde.

    – aosaimy

    25. April um 22:13

  • Das hat mir geholfen, obwohl in meinem Fall die Fehlerquelle in meiner Bibliothek lag und ich einfach die Direktive, die den Fehler verursachte, an den Anfang ihrer Datei verschoben habe. Ich wette, ich hätte auch die Exportreihenfolge in den public-api.ts ändern können. Ich kann nicht glauben, dass es funktioniert hat … scheint flockig zu sein.

    – AndrewBenjamin

    30. April um 15:29

Benutzeravatar von Hamidreza Vakilian
Hamidreza Vakilian

Zirkuläre Abhängigkeit ist der Teufel!

Dies führt dazu, dass die gesamte Abhängigkeitsschleife vom Compiler nicht aufgelöst werden kann. In den meisten Fällen sehen die Fehler so aus, als würden Sie die Klassen überhaupt nicht importieren.

Manche denken vielleicht, dass zirkuläre Abhängigkeiten nur in Diensten und Modulen verhindert werden sollten. Zirkuläre Abhängigkeiten sollten jedoch in allen Formen verhindert werden, sogar in Modellen, Komponenten und Klassen.

Wenn Sie eine zirkuläre Abhängigkeit haben, ist das ein Zeichen dafür, dass Sie (früher oder später) Ihren Code umgestalten und neu strukturieren müssen. Die folgenden Hinweise können dabei hilfreich sein. Angenommen, wir möchten die zirkuläre Abhängigkeit zwischen zwei Klassen A, B beseitigen.

Lösung 1: Vereinigung/Zusammenführung

A und B folgen demselben Konzept und können zu einer einzigen Klasse zusammengeführt werden.

Lösung 2: Trennung/Erschaffung

Es sollte eine neue Klasse C geben, auf die sich sowohl A als auch B verlassen oder die irgendwo zwischen diesen beiden liegt.

Meiner Erfahrung nach entsteht die zirkuläre Abhängigkeit in den meisten Fällen, weil der Entwickler dazu neigt, n Logiken in k (k

  • Deshalb verzichten alle auf Angular

    – Dina fliegt

    6. Januar um 12:58

  • @DinaFlies Zirkuläre Abhängigkeiten zwischen Modulen gelten aufgrund ihrer negativen Auswirkungen unabhängig von der Plattform als Anti-Pattern. Es geht also nicht um Winkel oder eine bestimmte Plattform.

    – Hamidreza Vakilian

    7. Januar um 12:38

  • Ich habe den Teil verpasst, den ich erwähnt habe, zirkuläre Abhängigkeiten. Während der Umgang mit Modulen bei Angular besonders komplex ist, importieren andere Frameworks ihre Komponenten einfach dort, wo sie benötigt werden.

    – Dina fliegt

    7. Januar um 17:25 Uhr

1453070cookie-checkAngular: 7.2.1 ES6-Klasse ReferenceError: Auf „X“ kann vor der Initialisierung nicht zugegriffen werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy