网站搜索

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”声明变量有什么区别?