typescript - Tipe Enum tidak didefinisikan saat runtime


Saya memiliki masalah di mana compiler Typescript berhasil mengompilasi kode saya, namun saat dijalankan muncul kesalahan tipe undefined.

Di aplikasi saya, saya membuat file types.ts dengan beberapa hal yang dibagikan antara beberapa file ts lainnya. File ini berisi enum string seperti:

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

Ketika saya mendefinisikannya seperti ini. Compiler membiarkan saya menggunakannya di file ts lain, dan tampaknya senang. Namun, saat runtime saya mendapatkan error "MyEnum tidak terdefinisi".

Saya tahu dua cara untuk menyelesaikan ini:

  1. Definisikan enum di file tempat ia digunakan. Tapi saya rasa ini tidak akan menyelesaikan apapun untuk file lain yang ingin menggunakannya.
  2. Gunakan "export" di file types.ts, dan impor setiap tipe secara eksplisit di mana pun digunakan.

Saya cukup baru dalam Typescript, dan saya merasa saya mungkin salah paham sesuatu yang mendasar.

Pertama, saya tidak mengerti mengapa compiler Typescript dengan senang hati mengompilasi kode saya jika akan ada kesalahan saat runtime. Saya akan memahaminya jika saya menggunakan kata kunci declare, memberitahu compiler bahwa sesuatu seharusnya tersedia saat runtime, tetapi dalam kasus ini saya tidak melihat mengapa harus menganggap bahwa enum berasal dari tempat lain selain file types.ts.

Kedua, saya ingin mendefinisikan tipe di suatu tempat secara global dalam aplikasi saya dan agar tipe tersebut tersedia di mana saja tanpa harus mengimpornya setiap kali saya menggunakannya. Bagaimana saya bisa mencapainya? Atau apakah ini mungkin dianggap praktik buruk?

Saya menggunakan Typescript 2.6 dan konfigurasi saya terlihat seperti ini:

{
  "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"]
}

Jawaban #1

Dalam kasus saya dengan enum undefined, ternyata itu disebabkan oleh impor melingkar:

export enum A {...} didefinisikan di file a.ts, export const b=... didefinisikan di file b.ts;

import {A} from './a.ts' di b.ts, sementara import {b} from './b.ts' di a.ts.

Kesalahan itu hilang setelah menghapus impor sirkular.

Jawaban #2

Ada cara lain yang bisa Anda lakukan ini. Jika Anda tidak ingin mengekspor enum Anda, Anda bisa mendefinisikannya sebagai const enum

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

Ini di-inline oleh compiler dan sepenuhnya dihapus selama kompilasi.

Jawaban #3

Saya mengalami masalah yang sama ketika mengimpor enum yang diekspor ulang. Itu menyebabkan kesalahan saat runtime.

layout.ts

export enum Part { Column, Row }

index.ts

export * from './layout'

komponen.ts

import { Part } from '../entities' // This causes error
import { Part } from '../entities/layout' // This works

Jawaban #4

Saya mengalami masalah ini karena saya menggunakan declare di

export declare enum SomeEnum

Alih-alih

export enum SomeEnum

Artikel terkait