我不了解现代Javascript的一件事。我看到很多人在讨论是否应该在需要新模块时使用var
,const
或let
。大多数人都说它const
是他们的首要任务,let
秒,但我没有看到很多人忠于var
。但是,下面的代码会引发error TS2451: Cannot redeclare block-scoped variable 'other'
错误。 (注意:此错误来自Typescript编译器,使用commonjs
标志。)
main.js
'use strict';
const A = require('./A.js');
const B = require('./B.js');
// do more stuff
A.js
'use strict';
const other = require('./other.js');
class A {
//...
};
module.exports = A;
B.js
'use strict';
const other = require('./other.js');
class B {
//...
};
module.exports = B;
我不确定在哪些情况下使用const
时没有错误。它似乎只有在使用const
在主模块中导入模块时才有效,然后其他模块中的所有其他模块都有var
来导入同一模块。我想知道我是否遗漏了什么。感谢。
修改
这是我的一个模块的代码。当我将顶部的var
更改为const
时,错误就会开始。我还在其他互连的模块中定义了相同的导入。
var Datastore = require('nedb');
var validate = require("validate.js");
var path = require('path');
module.exports = class Planet{
private db_filename : string = "db/planets.db";
private ds;
private static instance : Planet = null;
private constructor(){
}
init(db_filename : string) : Planet{
this.ds = new Datastore({ filename: db_filename, autoload: true, timestampData: true });
return this;
}
static get_instance() : Planet{
if(this.instance == null)
this.instance = new Planet();
return this.instance;
}
}
答案 0 :(得分:2)
一般来说:您可以重新定义用var定义的变量,不能使用const / let-defined变量。您应该始终使用const,因为如果您不小心重新定义变量,它会抛出错误(如您所见)。如果您需要稍后修改变量,则必须降级以允许。
// works
var a = 1;
var a = 2;
// error (because var a is defined above)
let a = 1;
let b = 1;
// error (because let b is defined above)
let b = 2;
// error
const b = 1;
// error
const a = 1;
const c = 1;
// error
const c = 2;
// error
c = 2;
我不知道为什么你的typescript-compiler会抛出错误。使用普通的node.js测试它可以很好地工作。