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
我刚刚发现,如果您有循环导入,这种情况也会发生。
Tim*_*ler 13
如果您想识别循环依赖项,请运行
npx madge --circular --extensions ts ./
(图片来源:Andrejs Abrickis 的博客https://andrejsabrickis.medium.com/locate-circular-dependency-in-typescript-modules-2b1eb03dbf2e)
在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 enum为enum,您的运行时错误就会消失。
| 归档时间: |
|
| 查看次数: |
2045 次 |
| 最近记录: |