You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:06:04