28

将我的 JS 转换为 TS 严格模式。

以下语法对我来说看起来不错,但 TS 在for循环中抱怨allSubMenus

[ts] Type 'NodeListOf<Element>' is not an array type or a string type.

我错过了什么?

function subAct(target:Node){

  const allSubMenus : NodeListOf<Element> = document.querySelectorAll('.subMenuItems') 

  for (const sub of allSubMenus){
    sub.classList.remove('active')
  }  
}
4

6 回答 6

30

您需要将target编译器选项设置为es6或更高NodeListOf<T>才能进行迭代。

于 2018-08-07T12:24:18.867 回答
30

根据您的打字稿目标编译器,可能会发生解析错误。

我对 HTMLCollectionOf<Element> 有同样的问题

为了解决这个问题,

  1. 您可以按照@Matt McCutchen 提到的那样更改您的 TS 目标编译器,或者
  2. 使其成为任何语法

const allSubMenus : NodeListOf<Element> = document.querySelectorAll('.subMenuItems') 

for (const sub of allSubMenus as any){ // then will pass compiler
  sub.classList.remove('active')
}  

注意:声明“any”会使集合(对象)只是数组,这会影响一些打字稿功能。


有关 ECMAScript(ES) 历史的更多信息,请查看以下 URL。 https://codeburst.io/javascript-wtf-is-es6-es8-es-2017-ecmascript-dca859e4821c

于 2018-11-07T05:23:42.957 回答
7

你可以试试

const allSubMenus : NodeListOf<Element> = document.querySelectorAll('.subMenuItems') 
Array.from(allSubMenus, subMenu => {/* */})
于 2019-10-10T10:04:09.917 回答
2

在tsconfig.json文件"downlevelIteration": true中的 compilerOptions 中设置。

来自https://www.typescriptlang.org/tsconfig#downlevelIteration

降级是 TypeScript 的术语,用于转换为旧版本的 JavaScript。此标志是为了支持更准确地实现现代 JavaScript 如何在旧 JavaScript 运行时中迭代新概念

于 2021-01-28T08:06:00.247 回答
1

NodeListOf您可以使用该方法迭代 a forEach

const allSubMenus : NodeListOf<Element> = document.querySelectorAll('.subMenuItems') 
allSubMenus.forEach(sub => sub.classList.remove('active'))

来源:https ://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.nodelistof.html#foreach

于 2020-05-24T21:57:07.540 回答
0

在编译代码时,您可以选择target: ES2017target: ES2015. 您也可以在tsconfig.json文件 unser中设置此属性compilerOptions

所以这里是命令行代码:

npx tsc path/to/file.ts --target ES2015

提示: 如果您将 babel 与 typescript 一起使用,完全建议您始终将 typescript 编译为最新版本的 Javascript,然后让 babel 处理其余的蒸腾过程。使用这种技术,您可以为旧浏览器添加另一个支持级别的保证手段,因为 typescript 无法编译将在例如 ie6 中运行的代码;所以 babel 来这里救援,让你确保你的js代码即使在 ie < 9 也能运行,它有有用的 polyfills 和其他工作所需的机制!

所以请记住:

始终让 typescript 将您的代码编译为最新的 javascript(通过设置target: ES2017)并让 babel 转换您的 js 代码以支持旧版浏览器(正确分离关注点并让每个人完成相关工作)。

于 2021-03-21T12:05:32.870 回答