TypeScript编译时报错cannot redeclare block-scoped variable如何解决
默认情况下,TypeScript 会将工作区下所有未被标记为 ES 模块的 .js、.ts 文件视为全局作用域下的脚本文件。你编译生成的 ex1.js 和原 ex1.ts 都在同一个目录下,且两个文件的顶层都声明了 n 变量,自然会被 TypeScript 类型检查判定为全局作用域下的重复声明。
VS Code 内置的 TypeScript 语言服务会实时扫描整个工作区的相关文件,所以编译出 ex1.js 之后会立刻触发报错,删除 ex1.js 后报错消失也是这个逻辑。
方案1:将 TS 文件标记为 ES 模块
ES 模块拥有独立的顶层作用域,不会和其他文件的全局变量冲突。只需要在ex1.ts的任意位置添加一行export {}即可,不需要对外导出任何实际内容,只要存在export关键字,TypeScript 就会将该文件识别为模块。
修改后的ex1.ts示例:let n: number = 10; export {};该方案修改成本极低,最适合写小型练习代码的场景。
方案2:添加 tsconfig.json 配置隔离文件
之前直接执行tsc ex1.ts没有调用项目配置,在exercises目录下新建tsconfig.json文件,添加以下配置即可解决冲突:{ "compilerOptions": { "target": "ESNext", "module": "ESNext", "rootDir": "./", "outDir": "./dist" }, "exclude": ["dist"] }后续直接执行
tsc命令即可自动读取配置,编译后的 JS 文件会统一存放在dist目录,不会和 TS 源文件互相干扰。方案3:关闭 JS 文件检查
如果不需要 TypeScript 检查工作区的 JS 文件,可以在tsconfig.json的compilerOptions中添加"allowJs": false,TypeScript 会直接忽略所有 JS 文件,也不会出现跨文件的变量声明冲突。
内容的提问来源于stack exchange,提问作者cottonpower

