为什么打字稿转换器没有提升变量?

时间:2016-05-12 16:26:59

标签: typescript transpiler

据我所知,ES6和TypeScript都支持块级别范围,但是当针对ES3和ES5时,输出应该是功能级别范围。我认为必须有一个逻辑背后为什么TypeScript不会提升变量..而且我没有遇到问题,我更好奇为什么它不会提升变量。

例如,给定以下TypeScript:

function seed(length: number, multiplier: number): number[] {
  let result: number[] = [];

  for(let i: number = 0; i < length; i++) {
    let n: number = i * multiplier;

    result.push(n);
  }

  return result;
}

转录器输出:

function seed(length, multiplier) {
  var result = [];
  for (var i = 0; i < length; i++) {
    var n = i * multiplier;
    result.push(n);
  }
  return result;
}

我期望的结果是将变量声明提升到函数顶部的结果。看起来像这样:

function seed(length, multiplier) {
  var
    i, n,
    result = [];

  for (i = 0; i < length; i++) {
    n = i * multiplier;
    result.push(n);
  }
  return result;
}

非常感谢任何见解。谢谢!

2 个答案:

答案 0 :(得分:4)

这是因为编译器不会根据编码标准输出代码。它试图尽可能接近原始输入。

请注意,var变量无论如何都会在幕后悬挂(var hoisting)。在这种情况下,TypeScript编译器不需要更改输入,这样做会不必要地增加其复杂性。

答案 1 :(得分:2)

  

我认为必须有一个逻辑背后为什么TypeScript没有提升变量..而且我没有遇到问题,我更好奇为什么它不会提升变量。

正是如此。因为这不是问题,为什么要通过吊装的努力呢?

同样在let的情况下以你展示的方式提升它实际上是错误的。

时间死区

首先,在let变量之类的声明之前,var变量不能被使用。使用var,您将获得undefined。使用let,由于时间死区,您将获得ReferenceError。幸运的是,TypeScript会给你一个编译时错误,所以你不要在运行时遇到它:

console.log(a); // Error: Block scoped variable used before declaration 
let a = 123;

阻止范围

let 中声明的

for变量仅在for循环中可用。这是因为它们是块范围而不是功能范围More on this

如果您误用let(而不是在运行时遇到它),TypeScript会再次给您一个编译时错误:

for(let i: number = 0; i < 10; i++) {    
}  
console.log(i); // Error: no variable i in scope

希望有所帮助