我在 RESTConfig.ts 文件中有以下界面和枚举:
export const enum RESTMethod {
POST = "POST",
GET = "GET"
}
export interface RESTConfig {
url: string;
method: RESTMethod;
data: any;
}
我想在另一个类中导入和使用枚举:
import { RESTConfig, RESTMethod } from './RESTConfig';
class Pipelines {
...
private someMethod() {
let rest: RESTConfig = {
url: "",
method: RESTMethod.POST,
data: {}
}
...
}
...
}
Linting和transpiling工作正常,但在运行时我收到以下错误:
TypeError:无法读取未定义
的属性“POST”
在“方法:RESTMethod.POST”行上。
有人能告诉我我做错了吗?
答案 0 :(得分:32)
我刚刚发现,如果您有循环进口,也很难做到这一点。
答案 1 :(得分:2)
在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
const enum
(您正在使用的那个):const枚举在JS中的编译过程中被删除,因此您不能在运行时使用它们。按照TS doc常量的存在,在访问枚举值时避免支付额外的生成代码和额外的间接访问费用。
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.
因此,只需将const enum
更改为enum
,您的运行时错误就会消失。
答案 2 :(得分:0)
尝试一下
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: {}
}
...
}
...
}
答案 3 :(得分:0)
将枚举放入独立文件时对我有用
答案 4 :(得分:0)
如果在运行测试时遇到此问题,请确保enum
文件中包含带有tsconfig.spec.json
的文件。
例如枚举在types.ts
文件中时
{
[...]
"include": ["types.ts"]
[...]
}
答案 5 :(得分:0)
如果您在 tsconfig.json 中有 --isolatedModules
或在 ts-loader 中有 transpileOnly
,您可能会点击 this issue。基本上,您不能将这些东西与 export const enum
结合使用。
用评论者的话来说:
<块引用>transpileOnly
表示一次转译每个文件.. 当编译器查看一个文件时,它无法知道它正在查看的引用是否是 const 枚举,因为声明位于另一个它无权访问的文件中..
所以我认为您不能将这两个概念混用,const enum
(需要整个程序信息)和 transpileOnly
(一次一个文件)。