如何让TypeScript不将.d.ts文件的导入输出到JS代码中?
解决TypeScript类型定义导入不输出到JS的问题
我来帮你搞定这个困扰——其实TypeScript从3.8版本开始就提供了专门的语法,能让你只导入类型定义,完全不会把这条导入语句编译到最终的JS文件里,正好匹配你的需求。
核心解决方案:使用类型专属导入(Type-Only Imports)
直接把你的导入语句改成类型导入语法就行,它的作用是明确告诉TypeScript:“我只需要这个模块的类型信息,不要把这条导入编译到JS里”。
修改后的导入代码:
import type * as third_party from './typings/third.party';
这样处理后,TypeScript会正常识别你的类型定义,编译后的JS文件里完全不会出现这条导入语句,完美符合你的要求。
为什么之前的方法行不通?
- 普通
import语句:TypeScript会把它当作“值导入”处理,哪怕你导入的是.d.ts文件,也会保留在JS输出里,因为TS默认认为你可能需要这个模块的运行时内容。 - 直接导入
.d.ts扩展名:TS本身禁止这种写法,因为它会自动扫描并处理类型定义文件,不需要你显式指定.d.ts后缀。 /// <reference path="..." />指令:这条指令没生效大概率是因为你的tsconfig.json配置问题,比如include数组没包含typings目录,导致TS没扫描到你的类型定义文件。不过这种方式本身就不如类型导入直观和可靠。
额外配置建议(确保TS能找到你的类型定义)
为了让TS自动识别你的typings目录下的类型定义,建议在tsconfig.json里做以下配置:
{ "compilerOptions": { "target": "esnext", "module": "esnext" // 其他你的配置... }, "include": [ "src/**/*", // 你的源码目录 "typings/**/*.d.ts" // 新增这一行,让TS扫描typings下的所有类型定义文件 ] }
这样配置后,TS会自动加载typings目录下的所有.d.ts文件,你甚至可以不用手动导入,直接使用里面定义的类型(如果是模块类型还是建议用import type,代码更清晰)。
补充:如果是全局类型定义
如果你的第三方库是全局挂载的(不是模块形式),可以在third.party.d.ts里用declare global声明全局类型,比如:
declare global { interface Window { ThirdParty: { someFunc: (arg: string) => void; // 其他API类型... } } }
这种情况下,你不需要任何导入语句,直接在代码里使用window.ThirdParty就能获得类型提示,也不会有任何多余的JS输出。
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

