为什么在顶层声明 const
或 let
会导致 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 编写的 ts
和 js
之间工作。
最佳答案
除非文件中存在(使用)导入或导出,否则编译器不会将您的 .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/