编译时未定义的 TypeScript 枚举

jyu*_*rek 6 typescript jestjs

我有一个定义在的枚举types.ts

export enum Handedness {
  Left,
  Right,
  Both,
}

export type State = {
  count: number
  handedness: Handedness
}
Run Code Online (Sandbox Code Playgroud)

我有一个正在初始化的对象state.ts

import { State, Handedness } from './types'

export const initial: State = {
  count: 0,
  handedness: Handedness.Both
}
Run Code Online (Sandbox Code Playgroud)

当我jest为这个项目运行测试(通过)时,state.ts生成一个错误TypeError: Cannot read property 'Both' of undefined,告诉我它Handedness在被引用时没有定义。但是我从它的模块中导出它并在我使用它之前导入它......所以它应该被定义。

我发现其他类似的问题询问未定义的枚举,但他们似乎都在询问运行时。据我所知,这是一个编译时问题。

我不知道我会在这里做错什么。我在其他地方导入其他类型没有问题。但是这个枚举根本不想工作。这里发生了什么,我该如何解决?

小智 7

我在使用 Jest 运行代码时遇到了类似的错误。该问题是由一个 React 组件引起的,该组件从一个模块导入了一个枚举类型,该模块也被 jest.mock 模拟。我通过使用 jest.spyOn 来解决我需要的方法而不是整个模块的问题。

从: jest.mock("example/path", () => ({ useExampleMethod: () => {...

到: import * as exampleModule from "example/path"; jest.spyOn(exampleModule , 'useExampleMethod').mockReturnValue({...


jyu*_*rek 6

好吧,这不是让它工作的方法,但是这个 GitHub PR解释说ts-jest不会支持像这样工作的枚举。我已将所有用途更改为(例如)("both" as Handedness)并且它有效。所以,这不是解释,而是一种解决方法。


ben*_*neb 5

您还可以尝试使用const enums

所以改变:

export enum Whatever { ... }
Run Code Online (Sandbox Code Playgroud)

export const enum Whatever { ... }
Run Code Online (Sandbox Code Playgroud)

显然从 23.10 版本开始ts-jest你就可以这样做了。好多了!