Rollup提示类型未从文件导出但实际存在,Svelte+TS项目编译失败
问题原因与解决方案
1. 类型-only导入语法缺失(最常见原因)
VoidPromiseCallback是TypeScript类型定义,不属于运行时代码,TS编译为JS时会自动擦除所有类型相关代码。你当前的导入语法会让Rollup尝试从编译后的types.js文件中查找运行时导出的VoidPromiseCallback值,自然找不到。VS Code能正常跳转是因为编辑器仅做类型层面的静态识别,不会校验运行时导出。
解决方法:
使用TypeScript的类型专用导入语法:
// 如果Topic也是类型,统一用type导入 import type { Topic, VoidPromiseCallback } from '../types.js'; // 如果Topic是运行时可用的类/变量,分开导入 import { Topic } from '../types.js'; import type { VoidPromiseCallback } from '../types.js';
如果你的项目开启了tsconfig.json中的isolatedModules配置,强制要求所有类型导入必须使用import type语法,调整后即可解决报错。
2. Rollup缓存未失效
你的猜测是合理的,Rollup的增量构建缓存没有检测到types.ts的导出变更,会保留旧的导出识别结果。
解决方法:
删除所有本地构建缓存目录后重启开发服务即可:
- 通用Rollup缓存:删除
.rollup.cache目录 - SvelteKit项目:删除
.svelte-kit目录 - 通用依赖缓存:删除
node_modules/.cache目录
3. 导入路径后缀配置不匹配
你导入时用的后缀是.js,但源文件是.ts,如果Rollup的TS处理插件配置不正确,会无法正确识别.ts文件到.js导入路径的映射。
解决方法:
- 尝试将导入路径修改为
../types.ts - 检查
tsconfig.json中的moduleResolution配置,设置为Bundler或NodeNext即可支持在TS文件中导入.js后缀的模块路径。
4. 命名冲突或隐性语法错误
小概率情况是types.ts中VoidPromiseCallback定义前存在语法错误,或者有同名的未导出变量/类型覆盖了导出声明,可尝试在types.ts中临时新增一个测试导出的普通变量,看能不能正常导入,排查是不是该文件的整体导出识别异常。
内容的提问来源于stack exchange,提问作者Cédric Van Rompay
相关产品推荐
相关产品推荐

