typescript - Enum-typ är inte definierad vid körning
Jag har ett problem där Typescript-kompilatorn kompilerar min kod framgångsrikt, men körningen ger mig fel på grund av undefined-typer.
I min app skapade jag en types.ts-fil med några saker som delas mellan flera andra ts-filer. Den innehåller ett strängenum som:
enum MyEnum {
One = "one";
Two = "two";
}
När jag definierar det så här. Kompilatorn låter mig använda det i andra ts-filer och verkar vara nöjd. Men vid körning får jag felet "MyEnum är inte definierad".
Jag känner till två sätt att lösa detta:
- Definiera enumen i filen där den används. Men jag tror inte att detta kommer att lösa något för andra filer som vill använda den.
- Använd "export" i filen types.ts, och importera varje typ uttryckligen överallt där den används.
Jag är ganska ny på Typescript, och jag känner att jag kanske missförstår något grundläggande.
För det första förstår jag inte varför Typescript-kompilatorn glatt kompilerar min kod om det kommer att uppstå ett runtime-fel. Jag skulle förstå det om jag hade använt declare-nyckelordet, vilket talar om för kompilatorn att något bör vara tillgängligt vid körning, men i det här fallet ser jag inte varför den skulle anta att enumen kommer från någon annan plats än filen types.ts.
För det andra skulle jag vilja definiera typer någonstans globalt i min app och ha dem tillgängliga överallt utan att behöva importera dem varje gång jag använde dem. Hur uppnår jag detta? Eller är detta kanske betraktat som en dålig praxis?
Jag använder Typescript 2.6 och min konfiguration ser ut så här:
{
"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"]
}
Svar #1
I mitt fall med undefined enum visade det sig vara på grund av cirkulär import:
export enum A {...} definierad i filen a.ts, export const b=... definierad i filen b.ts;
import {A} från './a.ts' i b.ts, medan import {b} från './b.ts' i a.ts.
Felet försvann efter att ha tagit bort cirkulära importeringar.
Svar #2
Det finns ett annat sätt du kan göra detta på. Om du inte vill exportera din enum kan du definiera den som en const enum
const enum MyEnum {
One = "one";
Two = "two";
}
Dessa inlines av kompilatorn och tas bort helt under kompileringen.
Svar #3
Jag hade samma problem när jag importerade en återexporterad enum. Det orsakade ett körtidsfel.
layout.ts
export enum Part { Column, Row }
index.ts
export * from './layout'
komponent.ts
import { Part } from '../entities' // This causes error
import { Part } from '../entities/layout' // This works
Svar #4
Jag hade detta problem eftersom jag använde declare i
export declare enum SomeEnum
Istället för
export enum SomeEnum
