为什么在有顶级常量时,Typescript会出错,或者在Node.js的许多文件中让相同的名字出现

为什么在顶层声明一个constlet导致TS2451错误(见下文)? 我明白,在浏览器中,所有的脚本共享顶级范围,但我正在写所有模块包装的 Node.js。

  • 这种情况下的错误是否与Node.js相关?
    • 如果不是,可以configuration了/configuration我的问题?
  • 为什么var不会发生同样的错误?
    • 是不是在顶层的范围接近var,const和let是相同的?

a.ts

 let lme = 'A'; const cme = 'A'; var me = 'a'; 

b.js

 let lme = 'A'; const cme = 'A'; var me = 'a'; 

tsconfig.json

 { "compilerOptions": { "module": "commonjs", "target": "es6", "noImplicitAny": false, "sourceMap": false }, "exclude": [ "node_modules" ] } 

输出

 $ tsc a.ts(3,5): error TS2451: Cannot redeclare block-scoped variable 'lme'. a.ts(4,7): error TS2451: Cannot redeclare block-scoped variable 'cme'. b.ts(3,5): error TS2451: Cannot redeclare block-scoped variable 'lme'. b.ts(4,7): error TS2451: Cannot redeclare block-scoped variable 'cme'. 

背景

 $ tsc --version Version 1.8.10 $ node --version v6.5.0 

我试图将.js多个文件移植到.ts文件时遇到这个问题,它的const fs = require('fs'); 。 我曾经假设大部分基本的东西只能在为Node.js编写的tsjs之间起作用。

编译器不会将.ts文件视为模块,除非文件中有( 使用 )导入或导出。
因为它抱怨重新重新宣布的变数。

例如:

 const A = 3; 

被编译进去

 var A = 3; 

 import * as Utils from "./utils" const A = 3 * Utils.A; 

被编译进去

 "use strict"; var Utils = require("./utils"); var A = 3 * Utils.A; 

没有导入/导出,编译器不会将其视为模块。


编辑

您可以使用require语法,您只需要引用节点定义:

 /// <reference path="./node.d.ts" /> const Utils = require("./utils")