本地包导入能否使用包名?解决TS5055文件覆盖错误
问题描述
我正在开发一个包,希望仅当调用本地包的某个特定函数时才构建测试。我通过Babel插件遍历代码,查找特定模块导入来执行相关操作。
当前我使用本地路径导入函数:
import { myFunction } from './';
我希望改用包名导入:
import { myFunction } from 'my-real-package-name';
但本地安装包后,构建时出现TypeScript错误:
error TS5055: Cannot write file '/my-real-package-name/lib/index.d.ts' because it would overwrite input file.
我不想同时检查./和my-real-package-name两种导入路径,只想用包名导入,有没有其他实现方式?
解决方案
配置TypeScript路径映射
在tsconfig.json里添加paths配置,把包名直接映射到本地源码入口,这样既用包名导入,又不会触发文件覆盖错误:{ "compilerOptions": { "baseUrl": ".", "paths": { "my-real-package-name": ["src/index.ts"], "my-real-package-name/*": ["src/*"] } } }TypeScript会自动把包名导入解析为本地源码路径,完全不需要本地安装自身包。
调整Babel插件逻辑
因为路径映射已经让包名导入指向本地源码,你的Babel插件遍历代码时,依然能正常识别到对应的模块导入,不需要额外修改插件逻辑。若必须本地安装自身包,修改输出目录
如果因为某些原因必须本地安装自己的包,就修改tsconfig.json的outDir,让编译输出到和包本身不同的目录:{ "compilerOptions": { "outDir": "./dist" } }同时更新包的
package.json里的main、types字段,指向新的输出目录(比如dist/index.js、dist/index.d.ts),避免和已安装的包文件冲突。
内容的提问来源于stack exchange,提问作者Nicolas Bouvrette
相关产品推荐
相关产品推荐

