Typescript运行时错误:无法读取未定义(枚举)的属性

Typescript运行时错误:无法读取未定义(枚举)的属性,typescript,enums,undefined,Typescript,Enums,Undefined,我在RESTConfig.ts文件中有以下接口和枚举: 我想在另一个类中导入并使用枚举,例如: import { RESTConfig, RESTMethod } from './RESTConfig'; class Pipelines { ... private someMethod() { let rest: RESTConfig = { url: "", method: RESTMethod.POST, dat

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

我想在另一个类中导入并使用枚举,例如:

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

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

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

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

在“method:RESTMethod.POST”行中


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

在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
  • 常量枚举
    (您正在使用的):
常量枚举在JS中的传输过程中被删除,因此您不能在运行时使用它们。As per const枚举的存在是为了避免在访问枚举值时支付额外生成代码和额外间接寻址的成本


所以只要将
const enum
更改为
enum
,运行时错误就会消失

试试这个

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

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

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

   }
   ...
}


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

将enum放入一个独立的文件时,这对我很有效。

如果您在运行测试时遇到此问题,请确保带有
enum
的文件包含在
tsconfig.spec.json
文件中

e、 g.当枚举位于
types.ts
文件中时

{
  [...]
  "include": ["types.ts"]
  [...]
}
如果在tsconfig.json中有
--isolatedModules
,或者在ts loader中有
transpileOnly
,则可能会点击。基本上,您不能将这些东西与
export const enum
结合使用

用一位评论家的话来说:

transpileOnly
表示一次只传输一个文件。。当编译器查看一个文件时,它无法知道它正在查看的引用是否为常量枚举,因为声明位于它无权访问的另一个文件中

因此,我认为您不能将这两个概念混合使用,
const enum
s(需要整个程序信息)和
transpileOnly
(一次一个文件)


找到答案了吗?使枚举不为常量-删除“const”术语在导出声明枚举时也会发生。这是不难做到的!你救了我一天。谢谢。这应该会更进一步。我相信这可能是你有一个循环依赖
export enum RESTMethod {
   POST = "POST",
   GET = "GET"
}

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

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

   }
   ...
}

{
  [...]
  "include": ["types.ts"]
  [...]
}