后续变量声明必须具有相同的类型

时间:2017-11-06 11:52:40

标签: javascript typescript scope

对于以下代码,

// 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类型?

2 个答案:

答案 0 :(得分:3)

对代码的简单修复就是将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,这意味着两个变量可以具有相同的名称,但仍然是单独的变量。

答案 1 :(得分:0)

在JavaScript中使用“for..in”会公开数组的键/索引,只是'因为它不会迭代数组项,而是迭代数组中的键/索引阵列。例如,

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”'coz“let”关键字将变量绑定到本地范围,而不像JavaScript中的“var”关键字。