- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我曾尝试搜索有关其配置的 TypeScript 文档,但似乎无法找到应该是一个简单问题的答案。
简单地说,如何配置 typescript 编译器,使其知道我们正在使用哪些 JavaScript 功能集?
因此,例如,ES2019 登陆,我想“哦,想让我得到一些”。在那种情况下,我需要升级什么,以允许编译器转换和 pollyfill 它需要的东西?
tsconfig 中的 lib 选项让我感到困惑,而且文档对可用库的解释不多。我也无法直接在它们上找到任何东西。
假设 ES2019 出来了,我为它添加了 lib 选项(假设会有一个)。这是否意味着我现在可以使用 ES2019 功能?如果我希望支持从 ES2019 开始的所有内容,我是否需要为它下面的每个其他版本添加库?或者添加 ES2019 lib 是否提供了我所需要的一切?
这些库来自哪里?它们是核心 TypeScript 库的一部分,所以要获得更多我必须升级,还是我可以简单地升级一个单独的包,它就可以正常工作?
最后,这些库会提供完全支持该规范版本所需的一切。还是功能的子集?
在我们的项目中,我们目前使用 TypeScript 版本 2.5.3
我知道问题很多,因此非常感谢任何有关任何信息或文档链接的信息。
最佳答案
这个故事有点复杂,我们应该首先将它分为两部分:语言特性和运行时特性。
当我们说语言特性时,我们指的是对核心 JavaScript 语言语法的更改。例如 ES 2015
添加了对类、箭头函数 (=>
) 和 for-of
迭代的支持
Typescript 尝试尽快实现所有稳定的语言功能提案,并将它们向下编译为指定为编译器的 target
选项的 ES 版本。所以这意味着如果你有最新的 Typescript 编译器,它增加了对全新的 ES 2019
语言特性的支持,你将能够将它一直向下编译到 ES3
。 Typescript 将发出使这些功能在您所针对的任何版本的 ES 中工作所需的代码。
您现在可以看到它的实际效果。如果您以 ES5
为目标,箭头函数会被编译成常规的 function
并使用 _this
局部变量来捕获 this
.类被编译为一个函数和 prototype
集上的适当字段。
除了语言特性之外,我们还有某些运行时特性,这些特性描述了哪些内置对象类型可用,以及这些运行时对象具有哪些方法和字段。 ES
最新版本中的新对象类型示例为 Promise
或 Proxy
。
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 编译器会发出错误,指出某些类型丢失,您可以升级您的库,或更改您的目标(这将更改使用的默认库),但您必须确保运行时有必要的支持。
将语言特性一直向下编译到 es3
可能并不总是可行的(要么是因为缺少运行时特性,要么只是因为实现该特性的高成本并不能使它是编译器团队的优先事项)。以 es3
为目标时的属性访问器 (get
/set
) 是一个示例,这是不受支持的。但是,如果您使用不受支持的语言功能/目标组合,编译器应该警告您。
关于typescript - 在 TypeScript 中使用最新的 JavaScript 特性,例如 ES2018,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043439/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!