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

启用type: module的TypeScript包单元测试时如何带类型导入编译产物?

解决type: module下单元测试带类型导入编译后包的问题

你的TypeScript包启用了type: module,Rollup生成产物如下:

dist/cjs/index.cjs
dist/es6/index.mjs
dist/browser/index.js
dist/types.d.ts

单元测试采用Mocha+ts-node,配置为:

{
  "spec": "test/*.test.@(cjs|mjs|ts)",
  "require": [
    "ts-node/register"
  ],
  "loader": "ts-node/esm"
}

当前核心问题:type: module禁止目录导入,无法用import '..'或tsconfig-paths;直接导入编译后的文件会丢失类型定义。以下是可行解决方案:

方案1:用package.json的exports字段关联模块与类型

在根目录package.json中配置exports,同时指定类型入口,让Node.js和TypeScript自动识别:

{
  "type": "module",
  "exports": {
    ".": {
      "import": "./dist/es6/index.mjs",
      "require": "./dist/cjs/index.cjs",
      "types": "./dist/types.d.ts"
    }
  },
  "types": "./dist/types.d.ts" // 兼容旧版TypeScript
}

本地开发时,要么用npm link将包链接到全局,要么在测试项目的package.json依赖中添加"query-mvt": "file:.",之后测试文件直接导入包名即可获取类型:

import queryMvt from 'query-mvt';

方案2:tsconfig.json配置路径映射+tsconfig-paths

修改tsconfig.json,添加paths映射包名到编译后的ES模块,同时指定类型根目录:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "query-mvt": ["./dist/es6/index.mjs"]
    },
    "typeRoots": ["./dist"]
  }
}

安装tsconfig-paths依赖后,修改Mocha配置让ts-node读取路径映射:

{
  "spec": "test/*.test.@(cjs|mjs|ts)",
  "loader": "ts-node/esm",
  "require": ["tsconfig-paths/register"]
}

测试文件中直接导入包名即可带类型使用:

import queryMvt from 'query-mvt';

方案3:自定义类型声明文件映射

在测试目录下新建typings文件夹,创建query-mvt.d.ts声明文件:

declare module '../dist/cjs/index.cjs' {
  export * from '../../dist/types.d.ts';
}

之后测试文件导入编译后的文件时,TypeScript会自动关联类型:

import queryMvt from '../dist/cjs/index.cjs';

内容的提问来源于stack exchange,提问作者Criminal_Affair_At_SO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:16:00