如何测试TypeScript非导出模块?测试出现ReferenceError报错求助
问题修复方案
问题原因
你使用的是TypeScript旧版的**内部模块(namespace)**语法(module关键字),虽然编译时TypeScript能识别同模块内的成员,但测试运行环境(如Jest)无法正确处理这种模块的运行时作用域,导致抛出ReferenceError: myFunction is not defined错误。
修复方案
方案一:改用现代ES模块语法(推荐)
这是当前TypeScript的标准写法,兼容性更好:
- 修改
File1.ts为ES模块:
export function myFunction(): string { return "Hello, World!"; }
- 修改测试文件
File1.test.ts,直接导入目标函数:
import { myFunction } from './File1'; describe('Test1', () => { test('equal', () => { expect(myFunction()).toBe("Hello, World!"); }); });
- 确保
tsconfig.json的核心配置:
{ "module": "CommonJS", // 或ESNext,根据测试环境选择 "moduleResolution": "node", "files": [ "File1.test.ts", "File1.ts" ] }
方案二:保留内部模块语法(仅兼容旧代码)
如果必须沿用旧的module/namespace写法,需要从全局作用域明确访问模块成员:
- 可选:将
File1.ts的module替换为更清晰的namespace(TypeScript官方推荐):
namespace MyModule { export function myFunction(): string { return "Hello, World!"; } }
- 修改测试文件
File1.test.ts,直接通过全局的MyModule调用函数:
describe('Test1', () => { test('equal', () => { expect(MyModule.myFunction()).toBe("Hello, World!"); }); });
(注:编译后MyModule会挂载到全局作用域,因此可以直接访问)
内容的提问来源于stack exchange,提问作者Daniel Breul
相关产品推荐
相关产品推荐

