TypeScript:有没有办法在使用 'let' 重新定义变量时获得编译时错误?
考虑这种情况,我不小心重新定义了 'name' 字符串:
function printName( name:string )
{
let name = "Oops!";
console.log(name);
}
在这种情况下,我想要一个编译时错误。而且,我得到了一个。TypeScript 在编译时给出了“重复的标识符 'name'”。生活真美好。
但是现在当我添加 try/catch 时,我不再收到错误。
function printName(name: string )
{
try
{
let name = "Oops!";
console.log("printName: " + name);
}
catch (e)
{
console.log("error:", e);
}
}
为什么我不再收到错误了?我能做些什么仍然在编译时得到相同的错误吗?
编辑:显然,如果我把代码放在任何类型的块(比如 if-else)里面,当我重新定义一个参数时,我不会收到错误。显然 TypeScript 在这种情况下会认为我想在它自己的作用域内创建一个新变量,所以内部的名字变成了 name_1。有没有什么方法可以对此收到警告或错误?
答案#1
在那种情况下,没有办法让 TypeScript 本身产生错误。
在你的第一个例子中会产生一个错误,因为那个示例在运行时实际上会产生一个错误,类似于:
语法错误:标识符 'name' 已经被声明
然而,在第二种情况下,你在 try 块中对 name 变量进行了遮蔽,这本身并不是一个问题。它在运行时应该没问题(不会抛出错误)。
但是在 TypeScript 编译器之外也存在一些工具可以帮助发现此类问题。特别是,大多数代码检查工具都有一个 no-shadow 规则,例如 ts-lint 的 no-shadowed-variable 设置。
答案#2
你的 let name="Opps!" 位于 try/catch 块内并且有自己的作用域的原因。
阅读这个:在 JavaScript 中使用“let”和“var”声明变量有什么区别?