需要澄清目标和lib编译器选项

时间:2017-02-07 15:32:35

标签: typescript

我发现我对目标和lib选项以及它们如何与源代码中支持的功能进行交互感到困惑。我觉得文档需要改进一点,所以在提出问题之前就问这里。

我天真地假设target指定输出代码运行所需的JS版本(添加了模块加载器)。因此,我们总是可以使用TS支持的所有高级JS功能(如对象传播),编译器为我们指定的目标生成合适的代码。我认为它手头有polyfills等,代码只能在目标VM上运行。

但是,lib选项的文档指定了取决于目标的默认库。但是,libs会影响可用的源类型,从而影响我们可以使用的代码。因此,我们可以使用的源功能取决于目标。这不像我预期的那样。我应该说我对lib的理解是它们是带有不同API的类型,尽管文档并没有真正说明它们是什么。

我可以看到这里有一些语言功能不依赖于类型和其他功能。然而,目前尚不清楚这是否是造成这种情况的部分原因。

有人可以澄清一下吗?

第二个问题是,为什么ES6和ES2015 lib通常被记录为同一个东西。

感谢

1 个答案:

答案 0 :(得分:70)

(这是作为评论开始的,但它太长了。)

它有点令人困惑,部分原因是它背后有一些历史。我没有资格权威地回答这个问题,但是我从早期开发就开始关注TypeScript,这是我的理解:

  • --target告诉编译器在编译时要包含哪些库版本(例如ES5如果使用Promise会产生编译错误,但ES6会知道所有关于Promise编译器发出的JS版本(例如ES5将向下编译类语法,但是{{1}将它留在)。
  • 稍后添加了
  • ES6,以便您在编译时更好地控制要使用的库版本,而无需更改发出的JS目标。例如,一个常见问题是您可能包含用于ES6库功能的polyfill,例如--lib,但您希望通过下编译Promise语法来定位ES5浏览器。在class出现之前,您必须定位--lib以避免编译错误ES6,然后使用Babel再次编译 ,或者您可以定位{{} 1}}并为Promise提供您自己的类型定义,以便编译器不会给您一个错误。现在使用ES5,您可以简单地说出Promise--lib,编译器不会抱怨--target ES5,但仍会向ES5下编译。
  • 这两个选项都不会导致TS发出任何库polyfill(--lib ES6等),正如您明显发现的那样;您有责任提供正确的运行时库。它只会发出一些低级语言兼容性帮助程序,例如PromisePromise(区别在于__extends__awaiter不仅仅是一个可以填充的API运行时,它是具有语法含义的语言特性)。 class选项只是根据您在运行时知道的内容获得正确级别的编译检查的方法。
  • 至于async--lib的原因,仅仅因为ECMAScript更改了名称,而TS将旧名称作为向后兼容性的有效选项。 :)

您会在这些TS问题中找到很多内容: