为什么`downlevelIteration`默认不打开?

Cer*_*ism 13 typescript

当与传播运营商的使用靶向ES5 ...到转换IteratorArray,它显示的错误使用-downlevelIteration编译器选项。一旦启用,散布运算符似乎就可以完美地工作。

我不知道为什么需要指定这个?启用该功能后,除了从tslib添加更多发出的生成代码之外,还有其他缺点吗?

另一个示例:动态创建N个数组(例如3):

[...Array(3).keys()]  // output: [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

它在VS Code中显示错误:
在此处输入图片说明

来自的错误消息tsc

类型“ IterableIterator”不是数组类型或字符串类型。使用编译器选项'--downlevelIteration'允许迭代器进行迭代。

在TypeScript Playground中编辑和查看代码和错误

alo*_*ica 87

tl;dr:在你的情况下,使用Array.from(foo)

\n
Array.from(Array(3).keys())\n
Run Code Online (Sandbox Code Playgroud)\n

降级是 TypeScript\xe2\x80\x99 的术语,用于转译为旧版本的 JavaScript。该标志旨在支持更准确地实现现代 JavaScript 如何在旧版 JavaScript 运行时中迭代新概念。

\n

ECMAScript 6 添加了几个新的迭代原语:for / of循环 ( for (el of arr))、数组扩展 ( [a, ...b])、参数扩展 ( fn(...args)) 和Symbol.iterator。如果存在实现,--downlevelIteration则允许在 ES5 环境中更准确地使用这些迭代原语。Symbol.iterator

\n

由于在问题中我们遇到了数组扩展的情况,所以让我们深入研究一下这个。这是一个数组分布:

\n
// Make a new array who elements are 1 followed by the elements of arr2\nconst arr = [1, ...arr2];\n
Run Code Online (Sandbox Code Playgroud)\n

根据描述,听起来很容易降级到 ES5:

\n
// The same, right?\nconst arr = [1].concat(arr2);\n
Run Code Online (Sandbox Code Playgroud)\n

然而,在某些罕见的情况下,这明显不同。例如,如果一个数组中有一个 \xe2\x80\x9chole\xe2\x80\x9d ,则缺失的索引如果扩展,将创建一个自己的属性,但如果使用以下命令构建,则不会concat

\n
// Make an array where the \'1\' element is missing\nlet missing = [0, , 1];\nlet spreaded = [...missing];\nlet concated = [].concat(missing);\n// true\n"1" in spreaded;\n// false\n"1" in concated;\n
Run Code Online (Sandbox Code Playgroud)\n

downlevelIteration将使用Symbol.iterator(如果存在)来更准确地模拟 ES 6 行为。

\n

更多信息和示例在这里

\n

现在,在您的情况下,您不想仅仅为了生成基本范围而更改此行为。相反[...Array(3).keys()],您可以依靠Array.from(Array(3).keys())

\n


Ahm*_*r11 34

您所要做的就是将文件中的es5更改为es6tsconfig.json

在此输入图像描述


Bea*_*ith 9

阅读发行说明和文章TypeScript 2.3:ES3 / ES5的向下迭代之后,我相信该问题的答案是downlevelIteration被禁用,因为您需要(通过配置)决定您希望TypeScript如何处理兼容性代码的编译(以支持旧版本的Javascript)。

正如文章中更为冗长的解释所表明的那样,您必须决定是否要TypeScript内联必要的辅助函数(简单,但可能导致更大的生产包大小),或者是否要将TypeScript配置为tslib用作依赖项,然后对其外部方法进行调用。

我强烈建议阅读TypeScript 2.3:ES3 / ES5的向下迭代,以更深入地了解……并可能是解决您最初问题的另一种方法。