如何配置TypeScript不编译仅含类型定义的导入模块?
解决TypeScript编译生成不必要类型文件的问题
问题原因
你当前配置里的exclude: ["types"]之所以没生效,是因为src/index.ts导入了types/types.ts——TypeScript会将被项目文件引用的文件纳入编译范围,exclude仅对未被引用的文件生效。
解决方案
以下三种方法都可以避免生成types.js:
方法1:配置typeRoots(推荐)
将types目录声明为TypeScript的类型根目录,TypeScript会自动把该目录下的文件当作类型定义文件处理,不会编译生成JS文件。
修改tsconfig.json,在compilerOptions中添加typeRoots配置:
{ "compilerOptions": { "target": "es2016", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "typeRoots": ["./types"] } }
此时可以移除exclude中的"types",因为typeRoots已经明确了该目录的作用。
方法2:重命名类型文件为.d.ts
TypeScript默认将后缀为.d.ts的文件视为类型声明文件,不会编译生成对应的JS文件。只需把types/types.ts改名为types/types.d.ts,无需修改任何配置即可生效。
方法3:用include明确指定编译范围
通过include仅指定需要编译的src目录,即使index.ts导入了types.ts,TypeScript会识别它为类型依赖,不会编译生成JS文件:
{ "compilerOptions": { "target": "es2016", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true }, "include": ["src/**/*"] }
方法对比
typeRoots:最符合TypeScript类型组织规范,适合专门存放自定义类型的项目结构。- 改
.d.ts:操作最简单,适合单个或少量类型文件的场景。 include:适合需要严格控制编译范围的项目,确保只有业务代码被编译。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

