如何让TypeScript编译移除仅用于获取类型的JSON导入?
如何让TypeScript移除仅用于类型获取的JSON导入变量
问题场景
我在Node环境的TypeScript后端项目里,有个自动生成的JSON文件。现在用下面的代码导入它,纯粹是为了拿到JSON对象的类型:
import countries from '../generated/countries.json' assert { type: 'json' } type Countries = typeof countries运行时根本不需要
countries这个JS变量,能不能让TypeScript编译时直接把它删掉?主要是想避开Node关于ESM JSON导入是实验特性的警告。
解决方法
1. 用类型专属导入(TypeScript 3.8及以上支持)
直接把导入改成类型导入,TS只会处理类型信息,编译后不会生成任何运行时的导入代码:
import type countries from '../generated/countries.json' type Countries = typeof countries
这种方式连assert { type: 'json' }都不用加——因为类型导入本来就不会触发运行时的JSON加载,自然也不会触发Node的实验特性警告。
2. 手动声明JSON模块类型(彻底避开导入)
如果不想写导入语句,还可以手动声明JSON文件的类型,直接引用类型就行:
- 先在项目里建个类型声明文件,比如
types/json.d.ts,内容如下:
declare module '*.json' { const value: any; export default value; }
- 然后直接通过
import()类型引用拿到JSON的类型,完全不用写实际的导入:
type Countries = typeof import('../generated/countries.json').default
这种方式连编译后的JS里都不会有任何和这个JSON相关的代码,彻底解决警告问题。
验证是否生效
编译完之后去看生成的JS文件,如果里面找不到countries相关的导入语句,就说明已经成功移除了。
内容的提问来源于stack exchange,提问作者v-moe
相关产品推荐
相关产品推荐

