当与传播运营商的使用靶向ES5 ...
到转换Iterator
到Array
,它显示的错误使用-downlevelIteration
编译器选项。一旦启用,散布运算符似乎就可以完美地工作。
我不知道为什么需要指定这个?启用该功能后,除了从tslib添加更多发出的生成代码之外,还有其他缺点吗?
另一个示例:动态创建N个数组(例如3):
[...Array(3).keys()] // output: [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)
来自的错误消息tsc
:
类型“ IterableIterator”不是数组类型或字符串类型。使用编译器选项'--downlevelIteration'允许迭代器进行迭代。
alo*_*ica 87
tl;dr:在你的情况下,使用Array.from(foo)
:
Array.from(Array(3).keys())\n
Run Code Online (Sandbox Code Playgroud)\n降级是 TypeScript\xe2\x80\x99 的术语,用于转译为旧版本的 JavaScript。该标志旨在支持更准确地实现现代 JavaScript 如何在旧版 JavaScript 运行时中迭代新概念。
\nECMAScript 6 添加了几个新的迭代原语:for / of
循环 ( for (el of arr)
)、数组扩展 ( [a, ...b]
)、参数扩展 ( fn(...args)
) 和Symbol.iterator
。如果存在实现,--downlevelIteration
则允许在 ES5 环境中更准确地使用这些迭代原语。Symbol.iterator
由于在问题中我们遇到了数组扩展的情况,所以让我们深入研究一下这个。这是一个数组分布:
\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
:
// 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)\ndownlevelIteration
将使用Symbol.iterator
(如果存在)来更准确地模拟 ES 6 行为。
更多信息和示例在这里
\n现在,在您的情况下,您不想仅仅为了生成基本范围而更改此行为。相反[...Array(3).keys()]
,您可以依靠Array.from(Array(3).keys())
阅读发行说明和文章TypeScript 2.3:ES3 / ES5的向下迭代之后,我相信该问题的答案是downlevelIteration
被禁用,因为您需要(通过配置)决定您希望TypeScript如何处理兼容性代码的编译(以支持旧版本的Javascript)。
正如文章中更为冗长的解释所表明的那样,您必须决定是否要TypeScript内联必要的辅助函数(简单,但可能导致更大的生产包大小),或者是否要将TypeScript配置为tslib
用作依赖项,然后对其外部方法进行调用。
我强烈建议阅读TypeScript 2.3:ES3 / ES5的向下迭代,以更深入地了解……并可能是解决您最初问题的另一种方法。