【问题标题】:Subsequent variable declarations must have the same type后续的变量声明必须具有相同的类型
【发布时间】:2018-04-18 14:02:15
【问题描述】:

对于下面的代码,

// Print indexes
var randArray = [5, 6, 7, 8];
for(var val in randArray){ // val is type inferred to String type
  document.write(val + "<br>");
}
// Print values
for(var val of randArray){ // Line 95
  document.write(val + "<br>");
}

以下是错误,

tstut.ts(95,9): error TS2403: Subsequent variable declarations must have the same type. Variable 'val' must be of type 'string', but here has type 'number'.

以下代码,

// Print indexes
var randArray = [5, 6, 7, 8];
for(var index in randArray){
  document.write(index + "<br>");
}
// Print values
for(var val of randArray){
  document.write(val + "<br>");
}

解决问题。


在有问题的情况下,为什么val 类型不能是number 类型?

【问题讨论】:

  • 您正试图将val 强制转换为字符串。如果您使用val.toString() + "&lt;br&gt;",错误可能会消失?
  • @evolutionxbox 不,强制不能解决问题

标签: javascript typescript scope


【解决方案1】:

您的代码的一个简单修复方法是将var 更改为let

// Print indexes
var randArray = [5, 6, 7, 8];
for(let val in randArray){
  console.log(val);
}
// Print values
for(let val of randArray){
  console.log(val);
}

您的问题根源在于 var 关键字如何限定变量的范围。 (参见manual。)var 声明的作用域是封闭函数,因此您的第二个for(var val...) 实际上指向同一个变量,并且在 TypeScript 中,它们有一个单一的、已定义的类型。 let 将变量范围限定在封闭块或 for 中,这意味着这两个变量可以具有相同的名称,但仍然是单独的变量。

【讨论】:

  • 使用var 关键字,第一个循环中val 的范围在第二个for 循环中是否可见?这是一个变量范围问题吗?
  • 来自manual:“当使用 let 声明变量时,它使用一些所谓的词法作用域或块作用域。与使用 var 声明的变量不同,其作用域泄漏到其包含函数,块范围的变量在它们最近的包含块或 for 循环之外是不可见的。"
  • @overexchange 是的。 var 不是块作用域
【解决方案2】:

在 JavaScript 中使用 "for..in" 会暴露数组的 key/index,因为它不会遍历数组项,而是遍历数组中的键/索引大批。例如,

var randArray = [5, 6, 7, 8];
for(let val in randArray){
  document.write(val + "<br>");
}

在上面的代码中,无论“randArray”数组包含什么项目,它总是会抛出索引。

“for..of”来拯救。这是 TypeScript(和 ES6)中存在“for..of”的原因之一。上面带有“for..of”循环的代码将遍历数组中的项目。

此外,将“var”替换为“let”,因为“let”关键字将变量绑定到本地范围,这与 JavaScript 中的“var”关键字不同。

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 2017-07-14
    • 2016-11-07
    • 2019-09-04
    • 1970-01-01
    • 2016-04-11
    • 2020-09-11
    • 2017-10-23
    相关资源
    最近更新 更多