![](/img/trans.png)
[英]When i try to compile typescript code into javascript, getting **Type 'NodeListOf<Element>' is not an array type or a string type**
[英]Typescript,'NodeListOf<Element>' is not an array type or a string type
将我的 JS 转换为 TS 严格模式。
以下语法对我来说看起来不错,但 TS 在allSubMenus
的for
循环中抱怨:
[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')
}
}
这是打字稿侧解析错误。 我对 HTMLCollectionOf 有同样的问题
让它为已任,它为我工作
const allSubMenus : NodeListOf<Element> = document.querySelectorAll('.subMenuItems')
for (const sub of allSubMenus as any){ // then will pass compiler
sub.classList.remove('active')
}
您需要将target
编译器选项设置为es6
或更高版本,以便NodeListOf<T>
可迭代。
你可以试试
const allSubMenus : NodeListOf<Element> = document.querySelectorAll('.subMenuItems')
Array.from(allSubMenus, subMenu => {/* */})
在tsconfig.json文件的 compilerOptions 中设置"downlevelIteration": true
。
来自https://www.typescriptlang.org/tsconfig#downlevelIteration
Downleveling 是 TypeScript 的术语,用于转换为旧版本的 JavaScript。 此标志是为了支持更准确地实现现代 JavaScript 如何迭代旧 JavaScript 运行时中的新概念
您可以使用forEach
方法迭代NodeListOf
。
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
在编译代码时,您可以选择target: ES2017
或target: 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 代码以支持旧浏览器(正确分离关注点并让每个人完成相关工作)。
这假设您想要保留 ES5 目标(如果没有,将其升级到 ES6 也将解决该问题)。
for
循环function subAct(target:Node){
const allSubMenus = document.querySelectorAll('.subMenuItems');
for (let i = 0; i < allSubMenus.length; i += 1){
const sub = allSubMenus[i];
sub.classList.remove('active')
}
}
Array.from
为了使用它,您必须将ES2015.core
添加到compilerOptions.lib
并为Array.prototype.from
添加 polyfill 请注意,这将在集合上循环两次 - 第一种方法更好。
function subAct(target:Node){
const allSubMenus = Array.from(document.querySelectorAll('.subMenuItems'));
for (const sub of allSubMenus){
sub.classList.remove('active')
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.