如何解决TypeScript中‘Individual declarations in merged declaration must be all exported or all local’(TS2395)及隐式any类型错误?
解决Redux Store导入时的TypeScript错误
看起来你遇到的这两个TypeScript错误,大概率和代码重复声明或者配置变更有关,毕竟你说之前代码是正常的。咱们逐个拆解解决:
错误1:Individual declarations in merged declaration 'INITIAL_DOG_STATE' must be all exported or all local.ts(2395)
这个错误的核心是同名变量的声明混合了导出和局部作用域,TypeScript不允许这种合并声明。常见原因和解决办法:
- 检查
dog.store.ts文件里有没有重复声明INITIAL_DOG_STATE,比如不小心写了两次,一次加了export一次没加。删掉重复的,只保留带export的那一个。 - 排查整个项目里其他文件,有没有其他地方也声明了
INITIAL_DOG_STATE(不管是导出还是局部变量)。如果有,要么统一都导出,要么重命名避免冲突。 - 如果你最近开启了TypeScript的
declaration: true配置(生成.d.ts声明文件),可能是旧的编译产物残留导致冲突。清理一下项目的dist文件夹,或者用ng clean(Angular项目)清除缓存后重新编译。
错误2:Binding element 'INITIAL_DOG_STATE' implicitly has an 'any' type.
这个错误说明TypeScript无法正确推断INITIAL_DOG_STATE的类型,通常和模块解析或严格模式配置有关:
- 先确认
dog.store.ts里的INITIAL_DOG_STATE确实正确实现了IDogState接口,并且类型标注没问题(你现在的代码看起来是对的,但可以再检查一遍有没有拼写错误)。 - 检查导入路径是否正确!如果路径写错了,TypeScript找不到对应的模块,就会默认把导入的变量推断为
any。比如是不是./redux/stores/dog.store的路径层级不对? - 如果你最近开启了TypeScript的
strict: true配置(或者升级了Angular/TypeScript版本,默认开启了严格模式),noImplicitAny规则会触发这个错误。这种情况下,确保所有导入的变量都有明确类型,你可以试试把接口单独用type导入:import type { IDogState } from "./redux/stores/dog.store"; import { dogReducer, INITIAL_DOG_STATE } from "./redux/stores/dog.store"; - 最后,尝试重启TypeScript语言服务(VSCode里可以按
Ctrl+Shift+P,输入TypeScript: Restart TS Server),有时候缓存会导致类型推断异常。
针对配置变更的排查
既然你怀疑是TypeScript或Angular配置变更导致的,重点检查tsconfig.json的这些选项:
strict:是否从false改成了true,这个选项会开启一系列严格类型检查,包括noImplicitAny。declaration:是否新增了declaration: true,这会生成声明文件,容易引发合并声明冲突。moduleResolution:是否从node改成了其他值,Angular项目通常需要moduleResolution: node来正确解析相对路径模块。
内容的提问来源于stack exchange,提问作者Chriso Lopez
相关产品推荐
相关产品推荐

