引用从 npm 类型导入的枚举时出错

nao*_*omi 5 npm typescript

我最近向私有 npm 模块添加了类型。

该模块的导出类型之一是以下枚举:

export enum ServerResponseCode {
  LoginFailed: 'loginFailed',
  LoginExpired: 'loginExpired'
}
Run Code Online (Sandbox Code Playgroud)

然后它被另一个 typescript 项目导入并使用如下:

import { ServerResponseCode } from 'private-module'

if(response.code === ServerResponseCode.LoginExpired)
Run Code Online (Sandbox Code Playgroud)

此代码不会引发任何编译错误,但在运行时我收到错误:“无法读取未定义的属性 LoginExpired”

为什么会发生这种情况?我该如何解决?

nao*_*omi 3

解决方案是简单地在私有模块的类型声明文件中导出一个常量枚举:

export const enum ServerResponseCode {
  LoginFailed: 'loginFailed',
  LoginExpired: 'loginExpired'
}
Run Code Online (Sandbox Code Playgroud)

stackoverflow 线程的简短说明:

枚举被定义为const使得对其元素的任何引用都是内联的(由 ts 编译器),这样可以避免运行时查找ServerResponseCode实际的对象undefined(因为 .d.ts 文件不会生成任何 JS)。