启用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
相关产品推荐
相关产品推荐

