尽管tsconfig目标设置为ES5,为什么仍需要ES7 /阵列polyfill

时间:2019-05-23 13:24:24

标签: angular typescript polyfills tsc tsconfig

tsconfig.json中有以下设置。我添加了"es2017"以使用Array.includes。:

{
  "compilerOptions": {
    "lib": [
      "es6",
      "es2017",
      "dom"
    ],
    "module": "es6",
    "target": "es5"
  }
}

现在,我意识到,我必须在import 'core-js/es7/array';上添加polyfills.ts,并将Array.includes也用于Internet Explorer 11。{{ 1}}设置为target,没有tsconfig.json

为什么需要添加polyfill?

1 个答案:

答案 0 :(得分:0)

TypeScript said代码。 GitHub相关问题的“官方”原因似乎是@RyanCavanaugh non-goal

  

让编译器尝试找出所需的[ES20XX]方法,在何处发出这些方法,以及何时使用针对那些希望发出polyfill的控件,以及如何使用这些方法更改这些polyfill的来源等等,这是一个很大的麻烦,因为在脚本上下文中仅包含普通的[ES20XX] polyfill库可能带来的收益并不能证明这一点。

而且,正如该期所提到的,发出运行时代码是TypeScript的some

  

[非目标#] 6。提供其他运行时功能或库。而是使用TypeScript描述现有库。


我猜想有些困惑来自这样的事实:对于某些语言功能,TypeScript在定位较早的EcmaScript版本时确实降级了answer语言功能。确定某个功能是否将作为降级代码发出或是否需要填充的主要标准是语法

如果新语言功能在目标版本中从语法上来说无效,则它将降级,或者您将收到编译时警告。您不能强制填充无效的语法。例如,class Foo {}不是并且不能是有效的ES5代码...,因此在定位ES5时它将被转换为构造函数。

另一方面,如果该语言功能在目标版本中在语法上有效,则它将按原样发出,而不会发出警告。因此,[1,2,3].includes(0)就语法而言是完全有效的ES5代码。假设有人向ES5引擎添加了Array.prototype.includes方法,那么它甚至可以在运行时运行。因此它按原样发出。请注意,当您在es2017编译器选项中包含lib时,是在告诉TypeScript运行时将支持ES2017类型,因此没有编译时警告。添加类型库对运行时本身没有任何作用...因此,您需要负责填充/填充所需的任何内容。从编译器的角度来看,它无法处理您对运行时存在哪些方法撒谎的情况。显然,对于因运行时错误感到沮丧的人来说,这并不是什么安慰。

好吧,我猜是这样。


希望有帮助。祝你好运!