gpt4 book ai didi

typescript - 在 TypeScript 中使用最新的 JavaScript 特性,例如 ES2018

转载 作者:搜寻专家 更新时间:2023-10-30 20:32:34 25 4
gpt4 key购买 nike

我曾尝试搜索有关其配置的 TypeScript 文档,但似乎无法找到应该是一个简单问题的答案。

简单地说,如何配置 typescript 编译器,使其知道我们正在使用哪些 JavaScript 功能集?

因此,例如,ES2019 登陆,我想“哦,想让我得到一些”。在那种情况下,我需要升级什么,以允许编译器转换和 pollyfill 它需要的东西?

tsconfig 中的 lib 选项让我感到困惑,而且文档对可用库的解释不多。我也无法直接在它们上找到任何东西。

假设 ES2019 出来了,我为它添加了 lib 选项(假设会有一个)。这是否意味着我现在可以使用 ES2019 功能?如果我希望支持从 ES2019 开始的所有内容,我是否需要为它下面的每个其他版本添加库?或者添加 ES2019 lib 是否提供了我所需要的一切?

这些库来自哪里?它们是核心 TypeScript 库的一部分,所以要获得更多我必须升级,还是我可以简单地升级一个单独的包,它就可以正常工作?

最后,这些库会提供完全支持该规范版本所需的一切。还是功能的子集?

在我们的项目中,我们目前使用 TypeScript 版本 2.5.3

我知道问题很多,因此非常感谢任何有关任何信息或文档链接的信息。

最佳答案

这个故事有点复杂,我们应该首先将它分为两​​部分:语言特性和运行时特性。

ES 语言特性

当我们说语言特性时,我们指的是对核心 JavaScript 语言语法的更改。例如 ES 2015 添加了对类、箭头函数 (=>) 和 for-of 迭代的支持

Typescript 尝试尽快实现所有稳定的语言功能提案,并将它们向下编译为指定为编译器的 target 选项的 ES 版本。所以这意味着如果你有最新的 Typescript 编译器,它增加了对全新的 ES 2019 语言特性的支持,你将能够将它一直向下编译到 ES3。 Typescript 将发出使这些功能在您所针对的任何版本的 ES 中工作所需的代码。

您现在可以看到它的实际效果。如果您以 ES5 为目标,箭头函数会被编译成常规的 function 并使用 _this 局部变量来捕获 this .类被编译为一个函数和 prototype 集上的适当字段。

ES 运行时特性

除了语言特性之外,我们还有某些运行时特性,这些特性描述了哪些内置对象类型可用,以及这些运行时对象具有哪些方法和字段。 ES 最新版本中的新对象类型示例为 PromiseProxy

Typescript 不为此类功能提供 poly-fill,如果运行时不提供对这些功能的支持,如果您想使用它们,则需要使用自己的 poly-fill 实现。

然而,Typescript 确实需要知道运行时存在哪些内置对象以及它们的方法/字段是什么,这就是 lib 选项的用武之地。它允许您指定运行时环境会看起来像。

例如,您可以以 es5 为目标,但指定运行时将拥有符合 es2015 标准的所有内置对象(有些可能由运行时本身,您可以通过 poly-fill 添加其他运行时)

两者的交集

上面的划分是一种简化,因为一些语言特性依赖于某些内置对象和方法的存在。

例如,async/await 语言特性依赖于 promises 的存在。因此,如果您使用 async/await 并以 es5 为目标,您将收到一个错误,指出 Promise 构造函数不存在。如果您以 es5 为目标但指定了 lib: [ 'es2015', 'dom' ] 您将不再收到错误,因为您已经告诉编译器即使您希望向下编译为 es5,在运行时,Promise 构造函数将按照 es2015 运行时规范存在,在该特定库中表示(不是编译器的问题这将如何发生,多边形填充或内置运行时行为)。

通常,如果存在这种依赖, typescript 编译器会发出错误,指出某些类型丢失,您可以升级您的库,或更改您的目标(这将更改使用的默认库),但您必须确保运行时有必要的支持。

异常(exception)情况

将语言特性一直向下编译到 es3 可能并不总是可行的(要么是因为缺少运行时特性,要么只是因为实现该特性的高成本并不能使它是编译器团队的优先事项)。以 es3 为目标时的属性访问器 (get/set) 是一个示例,这是不受支持的。但是,如果您使用不受支持的语言功能/目标组合,编译器应该警告您。

关于typescript - 在 TypeScript 中使用最新的 JavaScript 特性,例如 ES2018,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com