Typescript运行时错误:无法读取undefined(enum)的属性

Yur*_*fen 12 enums undefined typescript

我在RESTConfig.ts文件中有以下接口和枚举:

export const enum RESTMethod {
   POST = "POST",
   GET = "GET"
}

export interface RESTConfig {
   url: string;
   method: RESTMethod;
   data: any;
}
Run Code Online (Sandbox Code Playgroud)

我想导入并使用另一个类中的枚举:

import { RESTConfig, RESTMethod } from './RESTConfig';

class Pipelines {
   ...
   private someMethod() {
      let rest: RESTConfig = {
         url: "",
         method: RESTMethod.POST,
         data: {}
      }
      ...

   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

Linting和transpiling工作正常,但在运行时我收到以下错误:

TypeError:无法读取未定义的属性"POST"

在"方法:RESTMethod.POST"一行.

有人能告诉我我做错了什么吗?

Chr*_*aks 69

我刚刚发现,如果您有循环导入,这种情况也会发生。

  • 这就是咬我的 (4认同)
  • 我相信这是[TypeScript/issues/3200](https://github.com/microsoft/TypeScript/issues/3200) (2认同)

Tim*_*ler 13

如果您想识别循环依赖项,请运行 npx madge --circular --extensions ts ./

(图片来源:Andrejs Abrickis 的博客https://andrejsabrickis.medium.com/locate-circular-dependency-in-typescript-modules-2b1eb03dbf2e


Gaë*_* M. 7

在Typescript中有两种枚举:

  • 经典版 enum

在将TS转换为JS的过程中,它们会转换为真实对象,因此它们在运行时存在。

enum Response {
    No = 0,
    Yes = 1,
}

const yes = Response.Yes; // Works at runtime

const nameOfYes = Response[yes]; // Also works at runtime because a reverse mapping is also generated during transpilation
Run Code Online (Sandbox Code Playgroud)
  • const enum (您正在使用的那个):

在JS中进行编译时,会删除常量枚举,因此您无法在运行时使用它们。按照TS doc const枚举的存在,以避免在访问枚举值时支付额外的生成代码和额外的间接调用的开销

const enum Response {
    No = 0,
    Yes = 1,
}

const yes = Response.Yes; // At runtime: ReferenceError: Response is not defined

const nameOfYes = Response[yes]; // During transpilation: TS2476: A const enum member can only be accessed using a string literal.
Run Code Online (Sandbox Code Playgroud)

因此,只需将其更改const enumenum,您的运行时错误就会消失。

  • 当您“导出声明枚举”时也会发生。 (12认同)
  • @MichałTatarynowicz 如果您需要“导出”枚举但还需要在运行时使用它,您如何解决这个问题? (12认同)

Yao*_* Li 6

当将枚举放入独立文件中时,它对我有用

  • 可能你有循环依赖 (2认同)