【问题标题】:Duplicate declaration in TypeScriptTypeScript 中的重复声明
【发布时间】:2013-02-28 22:11:45
【问题描述】:

考虑这段代码:

var a = [];

for (var i in a)
  /* nothing */;

var i : number;

i = 9;

如果我编译它,编译器会抱怨最后一行,说“无法将 'number' 转换为 'string'”。

大概 for..in 循环将 i 创建为字符串,但我希望编译器会抱怨 var i : number 而不是等到 i = 9 才抱怨。

如果我将var i : number 更改为var i : number = 8,编译器仍然不会抱怨,直到它到达i = 9

这是一个错误,还是我遗漏了什么?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果您最初声明了变量,它会警告您预测的位置。例如,如果您将此行放在代码的顶部:

    var i: string;
    

    它会警告您该行有重复的标识符:

    var i: number;
    

    当您在 for 语句中声明 i 时,它不会检测到重复的标识符,也许它应该检测到 - 所以您最终会遇到不同的错误,即您分配了错误类型的值。

    如果您想要重复标识符警告,这是这里的首要错误,最好的办法是在 http://typescript.codeplex.com/ 上记录错误

    【讨论】:

    【解决方案2】:

    这不是错误,要了解发生了什么,您必须了解 JavaScript 的行为方式,尤其是在有关提升的区域。本质上,您上面的代码与以下代码相同:

    var a = [],
        i;
    
    for (i in a)
      /* nothing */;
    
    i = 9;
    

    由于i 首次出现在您的 for 语句中,它的类型变成了字符串。 for (key: string in someVar) { }.

    这是一篇描述 JavaScript 中的提升和作用域的文章: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

    【讨论】:

    • 但这并不能解释为什么编译器不抱怨var i : number = 8
    • 当我执行var i: number = 8; 时,编译器会为我抱怨,至少在 0.8.2 版本中。
    • 我用的是0.8.3,没有报错。
    • 必须是 0.8.3 中的新错误。它在 0.8.2 中为我抱怨,但在 typescriptlang.org/Playground Wierdly 中没有,在 0.8.3 中您可以跟踪 typeof(i),它会告诉您“数字”,但如果您然后尝试 i * 10,您会得到描述的错误@oz1cz 在 OP 中。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2016-10-22
    • 2017-10-21
    • 2012-10-24
    • 2017-06-16
    相关资源
    最近更新 更多