能否使用Jest测试TypeScript分段模块内部定义的类型?
问题解决方案
你当前使用的是TypeScript早期内部模块(现称命名空间)的拆分编写模式,单个源文件没有顶层导出,所以直接导入单文件会触发模块不存在的报错,可按以下三种方案解决:
方案1:新增统一导出入口文件
在src目录下新增index.ts作为全局入口,通过TS的引用指令聚合所有拆分的命名空间后统一导出:
// src/index.ts /// <reference path="./CustomField.ts" /> /// <reference path="./Music.ts" /> export default deadbreaker;
测试文件直接导入这个入口即可正常访问模块内的所有类:
import deadbreaker from "../../src/index"; describe("CustomField Class", () => { test("实例化逻辑正常", () => { const field = new deadbreaker.CustomField(); expect(field).toBeInstanceOf(deadbreaker.CustomField); }) })
同步确认你的tsconfig.json开启了适配Jest的配置:
{ "compilerOptions": { "module": "CommonJS", "esModuleInterop": true, "skipLibCheck": true }, "include": ["src/**/*", "test/**/*"] }
方案2:直接测试编译后的完整SDK包
如果你的SDK最终会打包为单文件产物(比如dist/deadbreaker.js),可以直接导入打包后的文件测试,完全规避单源文件导入的问题:
import deadbreaker from "../../dist/deadbreaker"; // 测试逻辑和方案1完全一致
这种方案的测试逻辑更贴近用户实际使用SDK的场景,结果可信度更高。
方案3:(长期优化)升级模块语法
你当前使用的module关键字是TS已过时的内部模块语法,官方现已推荐用namespace关键字替代。如果要适配现代模块体系,可以调整为每个文件单独导出类,最后在入口合并命名空间,兼顾单文件测试需求和打包要求:
// 调整后的CustomField.ts export class CustomField {} // 调整后的Music.ts export class Music {} // src/index.ts 合并命名空间 import * as AllClasses from "./exports"; export const deadbreaker = { ...AllClasses }; export default deadbreaker;
调整后既可以单个导入类做细粒度单元测试,也能保证最终打包产物仍然导出完整的deadbreaker模块。
内容的提问来源于stack exchange,提问作者Fresh Code
相关产品推荐
相关产品推荐

