如何配置TypeScript使导入的无类型JS模块默认类型从any改为unknown
问题背景
默认情况下TypeScript遇到没有类型声明的JS模块时,会将模块导出的所有内容隐式推断为any类型,any类型可以赋值给任意类型的变量,因此不会对示例中的错误赋值操作做任何校验,存在类型安全隐患。
实现方法
有两种常用配置方案可以解决该问题:
方案1:直接拦截无类型JS模块导入(更严格)
在tsconfig.json的compilerOptions中开启noImplicitAny配置:
{ "compilerOptions": { "noImplicitAny": true } }
开启后,只要导入没有对应类型声明的JS模块,TypeScript会直接抛出「模块隐式包含any类型」的报错,从根源上禁止无类型模块的导入。
方案2:将无类型JS模块导出内容推断为unknown
如果需要允许导入无类型JS模块,仅要求对导出内容做类型校验,可以新增全局类型声明实现:
- 在项目根目录新建类型声明文件,例如
src/typings/global.d.ts - 添加如下通配符模块声明:
declare module "*" { type ModuleExports = { [key: string]: unknown; default: unknown; }; const exports: ModuleExports; export = exports; }
配置完成后,所有没有对应精确类型声明的模块,其导出的内容都会被推断为unknown类型。此时你给出的示例代码中,a被识别为unknown,赋值给指定类型的b时会触发TypeScript报错。
注意:该通配符声明的优先级低于已存在的精确模块类型声明,因此不会影响带类型定义的模块(如自带类型的npm包、自定义的.d.ts声明模块)的正常使用。
内容的提问来源于stack exchange,提问作者Francesco Meli
相关产品推荐
相关产品推荐

