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

Why does Typescript error when there is a top level const or let with the same name in many files with Node.js

本文关键字:let const 出错 Typescript 为什么 文件 许多 js Node 存在      更新时间:2023-09-26

为什么在顶级声明constlet会导致TS2451错误(见下文(?我知道在浏览器中,所有脚本都共享顶级作用域,但我是为Node.js编写的,所有模块都封装在Node.js中。

  • 这个场景中的错误与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移植到具有const fs = require('fs');.ts时遇到这种情况的。我认为最基本的东西只会在为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")