Enum-Typ zur Laufzeit nicht definiert

Ich habe ein problem, wo der Typescript-compiler kompiliert meinem code erfolgreich, aber die Laufzeit gibt mir undefined Fehler.

In meine app, die ich erstellt eine types.ts - Datei mit ein paar Dinge, die gemeinsam von mehreren anderen ts-Dateien. Es enthält einen string, enum wie:

enum MyEnum {
  One = "one";
  Two = "two";
}

Wenn ich es definieren wie diese. Der compiler lässt mich in anderen ts-Dateien, und scheint glücklich zu sein. Aber zur Laufzeit bekomme ich die Fehlermeldung "MyEnum ist nicht definiert".

Kenne ich zwei Möglichkeiten um dieses Problem zu lösen:

  1. Definieren, die enum in der Datei, wo es verwendet wird. Aber ich glaube nicht, dass dieses zu lösen, wird alles, was für andere Dateien, die Sie benutzen möchten.
  2. Verwenden Sie "export" in der Typen.ts-Datei, und importieren Sie jede Art ausdrücklich überall dort, wo es verwendet wird.

Ich bin ganz neu, Typoskript, und ich fühle, dass ich vielleicht etwas grundlegendes Missverständnis.

Erstmal, ich verstehe nicht, warum der Typescript-compiler glücklich kompiliert mein code, falls es zu einem Laufzeitfehler. Ich würde es verstehen wenn ich es gebraucht hatte declare - Schlüsselwort weist den compiler, dass etwas sollte werden zur Laufzeit verfügbar, aber in diesem Fall sehe ich nicht, warum es ist davon auszugehen, dass die enum-kommt von irgendwo anders, dann die Typen.ts-Datei.

Zweiten, ich würde gerne definieren Typen irgendwo weltweit in meine app und habe Sie überall verfügbar sind, ohne Sie zuvor importieren Sie jedes mal, wenn ich Sie genutzt. Wie kann ich dies erreichen? Oder ist das vielleicht als schlechte Praxis?

Ich bin mit Typoskript 2.6 und meine config sieht wie folgt aus:

{
  "compilerOptions": {
    /* Basic Options */
    "target": "es6",
    "module": "commonjs",
    "lib": ["es6", "es7", "esnext"],

    "sourceMap": true /* Generates corresponding '.map' file. */,
    "outDir": "build" /* Redirect output structure to the directory. */,
    "removeComments": true /* Do not emit comments to output. */,

    /* Strict Type-Checking Options */
    "strict": true /* Enable all strict type-checking options. */,

    /* Additional Checks */
    "noUnusedLocals": true /* Report errors on unused locals. */,
    "noUnusedParameters": true /* Report errors on unused parameters. */,
    "noImplicitReturns": true /* Report error when not all code paths in function return a value. */,
    "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,

    "plugins": [{ "name": "tslint-language-service" }],
    "skipLibCheck": true //because firebase-sdk has wrong type files now (Nov 18)
  },
  "include": ["src/**/*"],
  "exclude": ["build"]
}
Der enum wird transpiled als ein Objekt. Wenn Sie als ein-Knoten-app müssen Sie exportieren und importieren Sie Sie in die Dateien, in denen Sie verwenden möchten. Wenn Sie nicht, es würde nur in einer browser-Umgebung, wo Sie ein Skript mit Ihren transpiled-Datei mit dem enum ist platziert, bevor alle anderen Dateien, die auf das Objekt verweisen.
OK das Objekt macht Sinn für mich. Ich Frage mich, warum trat dies nur in meiner server-code und nicht den web-client. Aber könnten Sie erklären, ein bisschen mehr darüber, wie dies funktioniert im browser, oder einen link zu mehr Infos??? Tun enums werden Global deklarierten Variablen in einer browser-Umgebung?
Nein, Sie haben um ein script-tag mit der Datei transpiled mit dem enum-Objekt, bevor das script-tag, die Referenzen ... <script src="myscriptwiththeenum.js"><script/> ... und nach, dass <script src="myscriptthatusestheenum.js"><script/> ...<script src="myotherscriptthatusestheenum.js"><script/>. Wenn Sie webpack, browserify oder andere tool wie, dass nur die import-Anweisung, und Sie werden nicht haben zu Besorgnis über die Skript Reihenfolge
Ah ok. Aber technisch gesehen immer noch eine Globale variable, dann, aber nur vielleicht irgendwo versteckt 🙂 ich bin mit dem Typoskript Variante von CRA also ich denke, es behandelt schon. Ich Frage mich immer noch, was eine schöne Lösung ist auf der server-Seite. Durch die Verwendung von enum - (und export -) so bin ich gezwungen, nun auch den export und import alle anderen interface-und Typ-Deklarationen, die Leben in die Datei...

InformationsquelleAutor Thijs Koerselman | 2017-11-21

Schreibe einen Kommentar