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

BuZ*_*dEE 3 polyfills typescript tsc tsconfig angular

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

{
  "compilerOptions": {
    "lib": [
      "es6",
      "es2017",
      "dom"
    ],
    "module": "es6",
    "target": "es5"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我意识到,我必须添加import 'core-js/es7/array';polyfills.ts,以Array.includes用于Internet Explorer11。target中的tsconfig.json设置为es5,而没有Array.includes

为什么需要添加polyfill?

jca*_*alz 5

TypeScript 不会自动填充代码。正如@RyanCavanaugh 所说,相关的GitHub问题的“正式”原因似乎是:

让编译器尝试找出所需的[ES20XX]方法,在何处发出这些方法,以及何时为那些希望产生polyfill的人提供控件,以及更改这些polyfill的来源等的方法,这是仅在脚本上下文中包含普通的[ES20XX] polyfill库可能带来的好处并不能说明这一点。

而且,正如该问题中提到的那样,发出运行时代码不是TypeScript 的目标

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


我猜有些混乱来自于一个事实,即对于某一国语言的功能,打字稿确实下层一些针对早期的EcmaScript版本时,语言功能。在确定某个功能是否将作为降级代码发出或是否需要使用polyfill时,使用的主要标准是语法

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

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

哦,是的,我想是的。


希望能有所帮助。祝好运!