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:
- 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.
- 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"]
}
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine andere Möglichkeit können Sie dies tun. Wenn Sie nicht möchten, exportieren Sie Ihre enum-Sie können es definieren als const enum
Diese sind inline vom compiler und vollständig entfernt werden, während der Kompilierung.
InformationsquelleAutor nukefusion
Ich hatte das gleiche problem beim Import re-Export-enum. Es verursacht Laufzeitfehler.
layout.ts
index.ts
Komponente.ts
InformationsquelleAutor Chintsu
In meinem Fall von
undefined
enum, es stellte sich heraus, dass es ist, weil der zirkuläre importieren:export enum A {...}
definiert in Dateia.ts
,export const b = ...
definiert in Dateib.ts
;import {A} from './a.ts'
imb.ts
,während
import {b} from './b.ts'
ima.ts
.War der Fehler Weg nach dem entfernen zirkuläre Importe.
InformationsquelleAutor keos
Hatte ich diesen Fehler und es ging Weg, sobald ich verwendet die export-Schlüsselwort, d.h.
Und stellen Sie sicher, Sie importieren Sie Sie in die Dateien, in denen Sie es als gut, d.h.
Fand ich, dass wenn ich deklariert das enum, ohne das export-Schlüsselwort, konnte ich immer noch Bezug auf die enum-ohne Import in andere Dateien, ohne einen compiler-Fehler - es wurde nur zur Laufzeit der Undefinierte Ausnahme wurde geworfen.
Aus Neugier, welche IDE benutzt du? Mit Visual Studio-Code, wenn Sie geben Sie den Namen der enum-VS-Code generiert automatisch die import-Anweisung für Sie, das spart eine beträchtliche Menge an Zeit bei der Codierung, und hilft, um eine glatte ununterbrochene Strömung. Ich war ursprünglich mit JetBrains WebStorm gefunden, aber ich war mehr produktiv in der Visual Studio-Code-IDE.
InformationsquelleAutor Ciaran Gallagher
Hier ist mein Fall, wenn ich einen neuen enum zu
enum.ts
- Datei wie folgt:enum.ts
:Ich nicht laufen
tsc
zum kompilieren dieser Datei wieder. Diese verursachen dieenum.js
- Datei nicht dieRotateMode
enumenum.js
:Dann, ich Importiere die
RotateMode
enum zu meinemindex.ts
Datei:Ist das Ergebnis:
Irgendwie, die
import
syntax Priorität importieren Sie die.js
DateiSo, vergessen Sie NICHT, kompilieren Sie die ts-Datei nach dem hinzufügen von etwas neues
InformationsquelleAutor slideshowp2
};
--Export aller enums
InformationsquelleAutor Ranjeet Kumar