javascript - 当 Node.js 的许多文件中存在同名的顶级 const 或 let 时,为什么 Typescript 会出错

标签 javascript node.js typescript constants let

为什么在顶层声明 constlet 会导致 TS2451 错误(见下文)?我知道在浏览器中所有脚本共享顶级范围,但我正在为 Node.js 编写,其中所有 modules are wrapped .

  • 此场景中的此错误与 Node.js 相关吗?
    • 如果没有,可以配置掉吗/配置是我的问题吗?
  • 为什么 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语法,只需引用 Node 定义:

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

关于javascript - 当 Node.js 的许多文件中存在同名的顶级 const 或 let 时,为什么 Typescript 会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486931/

相关文章:

javascript - 通过引用更新嵌套对象

javascript - 监听 iframe 事件 - 打开 URL

node.js - 监视完整文件传输中的文件更改

node.js - Nunjucks: 'if' 与多个 'and' 或 'or' 条件

javascript - 你能结合socket.io的emit功能吗?

javascript - 如何使用 Angular2 和 TypeScript 在单击后禁用暂停按钮并在弹出窗口显示后立即启用

javascript - SVG "circle"元素半径属性 "r"在 Firefox 中不转换但在 Chrome 中很好

javascript - 如何使用内联样式调整 javascript 生成的 iframe 的大小?

javascript - 在 typescript 类中使用 "this"

javascript - 如何从 Angular 服务中的行为主体中提取数据?