枚举类型未在运行时定义

Thi*_*man 20 typescript

我有一个问题,Typescript编译器成功编译我的代码,但运行时给了我未定义的类型错误.

在我的应用中,我创建了一个types.ts文件,其中包含多个其他ts文件之间共享的内容 它包含一个字符串枚举,如:

enum MyEnum {
  One = "one";
  Two = "two";
}
Run Code Online (Sandbox Code Playgroud)

当我这样定义它.编译器让我在其他ts文件中使用它,看起来很开心.但是,在运行时我收到错误"MyEnum未定义".

我知道有两种方法可以解决这个问题:

  1. 在文件中定义枚举使用它.但我不认为这会解决其他想要使用它的文件.
  2. 在types.ts文件中使用"export",并在每个使用它的地方显式导入.

我对Typescript很新,我觉得我可能误解了一些基本的东西.

首先,我不明白为什么如果会出现运行时错误,Typescript编译器会愉快地编译我的代码.我会理解它,如果我使用了declare关键字,告诉编译器在运行时应该有什么东西可用,但在这种情况下我不明白为什么它应该假设枚举来自除了types.ts文件以外的任何地方.

其次,我想在我的应用程序中全局定义类型,并让它们在任何地方都可用,而不必在每次使用它们时都导入它们.我该如何做到这一点?或者这可能被认为是不好的做法?

我使用的是Typescript 2.6,我的配置如下所示:

{
  "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"]
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*t B 18

还有另一种方法可以做到这一点.如果您不想导出枚举,可以将其定义为const枚举

const enum MyEnum {
   One = "one";
   Two = "two";
}
Run Code Online (Sandbox Code Playgroud)

这些内容由编译器内联,并在编译期间完全删除.

  • 如果您需要将字符串解析为枚举,请小心使用此解决方案。我现在得到“const”枚举只能用于属性或索引访问表达式或导入声明或导出赋值的右侧。表达式:“(<any>MyEnum)[myString] === MyEnum .一个`. (3认同)
  • 使用 `const enum` 确实有效。但是为什么这个有效而不是仅使用 `enum` 呢? (3认同)
  • 谢谢,后来我也发现了。我也将它用于我导出的所有枚举。但我忘了这个问题还没有一个公认的答案...... (2认同)

小智 13

我遇到这个问题是因为我使用了声明

export declare enum SomeEnum
Run Code Online (Sandbox Code Playgroud)

代替

export enum SomeEnum
Run Code Online (Sandbox Code Playgroud)

  • 您知道为什么使用声明关键字会导致此问题吗?因此我无法从包中导入。 (2认同)

Chi*_*tsu 10

导入重新导出枚举时,我遇到了同样的问题。它导致运行时错误。

布局.ts

export enum Part { Column, Row }
Run Code Online (Sandbox Code Playgroud)

索引.ts

export * from './layout'
Run Code Online (Sandbox Code Playgroud)

组件.ts

import { Part  } from '../entities' // This causes error
import { Part } from '../entities/layout' // This works
Run Code Online (Sandbox Code Playgroud)


keo*_*eos 8

以我的undefinedenum为例,事实证明是由于循环导入:

export enum A {...}在文件a.tsexport const b = ...定义,在文件中 定义b.ts;

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

删除循环导入后,该错误消失了。

  • 今年的结局并不好,直到我找到了你的答案 - 与这个确切的问题纠缠了几个小时 - 当我看到这个问题时,在 2 分钟内修复了 - 谢谢! (2认同)

Bak*_*aki 5

对我们来说,事实证明,只需重新启动应用程序就可以解决问题。(本机脚本应用程序)