在Typescript中的NodeList上使用spread运算符

Mic*_*all 6 typescript ecmascript-6

我想使用ES6扩展运算符将NodeList转换为数组.我的项目使用TypeScript,它抛出了一个错误.

const slides = [...document.querySelectorAll('.review-item')];
Run Code Online (Sandbox Code Playgroud)

这是抛出的错误,错误TS2461:类型'NodeListOf'不是数组类型

Babel可以使用该代码.是否可以在TypeScript中使用或者我需要使用其他方法Object.keys()吗?

Est*_*ask 14

Spread语法与iterables一起使用,即NodeListOf.[...document.querySelectorAll('...')]在ES6中有效(只要浏览器支持DOM迭代或polyfilled).

问题是TypeScript特有的,它不严格遵循ES5目标和更低的ES规范.默认情况下,Spread语法仅限于数组

[...document.querySelectorAll('...')];
Run Code Online (Sandbox Code Playgroud)

被转化为

document.querySelectorAll('...').slice();
Run Code Online (Sandbox Code Playgroud)

它将导致错误,并且类型系统在编译时发出错误.

一种方法是使用Array.from(可以在ES5环境中进行polyfilled)将iterable转换为数组:

Array.from(document.querySelectorAll('...'));
Run Code Online (Sandbox Code Playgroud)

另一种方法是启用downlevelIteration编译器选项.它强制TypeScript 2.3及更高版本根据具有ES5目标和更低的ES规范处理迭代:

在针对ES5或ES3时,为for..of,spread和destructuring中的iterables提供全面支持.

DOM.Iterable应在lib编译器选项中指定以包括合适的类型.由于DOM迭代器需要浏览器支持,因此可以在旧版浏览器中对它们进行填充core-js.