【问题标题】:Need clarification of the target and lib compiler options需要澄清目标和 lib 编译器选项
【发布时间】:2017-06-24 22:16:14
【问题描述】:

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

我天真地假设 target 指定了输出代码需要运行的 JS 版本(添加了一个模块加载器)。因此,我们始终可以在源代码中使用 TS 支持的所有高级 JS 功能(如对象扩展),并且编译器会为我们指定的目标生成合适的代码。我假设它手头有 polyfill 等,并且代码只会在目标 VM 上运行。

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

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

有人可以澄清一下吗?

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

谢谢

【问题讨论】:

    标签: typescript


    【解决方案1】:

    (这开始是一条评论,但它太长了。)

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

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

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

    TSConfig 参考链接:

    【讨论】:

    • 感谢您的出色回答。所以我看到混淆的根源是-target 做了这两件事,加上一些语言特性是向下编译的,而另一些不是,但确实需要一个库才能在源代码中使用..
    • 这也回答了另一个问题 - 为什么你会使用 TS 和 Babel :) 所以针对许多当前浏览器的一个好方法是将 TS 中的目标 ES6 与 Babel 转译为 ES5。
    • @Aaron 在我的 TypeScript 版本中,lib.es6.d.ts 和 lib.es2015.d.ts 略有不同。 ES6 定义为 es2015(语言),带有 dom、dom.iterable、webworker.importscript 和 scripthost。
    • @cquezel 您正在查看generated es6.d.ts 文件和es2015.d.ts 文件,但是如果您使用--target es6,则使用es6.d.ts,这相当于@987654359 @(如docs 中所述)。如果你单独使用--lib es6,你不会得到DOM,等等。--lib es6--lib es2015 给你同样的东西。 --target es6--target es2015 也给你同样的东西。
    • “这有点令人困惑,部分原因是它背后有一些历史”一般来说是现代 JS。
    猜你喜欢
    • 2022-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2012-02-21
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多