Typescript运行时错误:无法读取未定义(枚举)的属性
我在RESTConfig.ts文件中有以下接口和枚举: 我想在另一个类中导入并使用枚举,例如: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
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
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
(您正在使用的):常量枚举
所以只要将
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"]
[...]
}