Javascript 为什么forEach在NodeListOf上不存在

Javascript 为什么forEach在NodeListOf上不存在,javascript,typescript,Javascript,Typescript,我的代码: var checkboxes = this.element.querySelectorAll("input[type=checkbox]") as NodeListOf<HTMLInputElement>; checkboxes.forEach(ele => { var key = ele.name; if (data.hasOwnProperty(key)) { if (!this.isArr

我的代码:

    var checkboxes = this.element.querySelectorAll("input[type=checkbox]") as NodeListOf<HTMLInputElement>;
    checkboxes.forEach(ele => {
        var key = ele.name;
        if (data.hasOwnProperty(key)) {
            if (!this.isArray(data[key])) {
                var temp = data[key];
                data[key] = [temp];
            }
        } else {
            data[key] = [];
        }
    });
var checkbox=this.element.querySelectorAll(“input[type=checkbox]”)作为NodeListOf;
复选框。forEach(ele=>{
var key=ele.name;
if(data.hasOwnProperty(key)){
如果(!this.isArray(数据[key])){
var temp=数据[键];
数据[键]=[温度];
}
}否则{
数据[键]=[];
}
});
但我有一个错误:

错误TS2339:类型上不存在属性“forEach” “诺德利斯托夫”

接口NodeListOf扩展了NodeList{
长度:数字;
项目(索引:编号):TNode;
[索引:编号]:TNode;
}
接口节点列表{
/**
*为列表中的每个条目返回键、值对数组
*/
entries():IterableIterator;
/**
*对列表中的每个节点执行指定的操作。
*@param callbackfn一个最多可接受三个参数的函数。forEach为列表中的每个元素调用callbackfn函数一次。
*@param thisArg this关键字可以在callbackfn函数中引用的对象。如果省略thisArg,则将undefined用作this值。
*/
forEach(callbackfn:(值:节点,索引:编号,列表对象:节点列表)=>void,thisArg?:any):void;
/**
*返回列表中键的列表
*/
keys():IterableIterator;
/**
*返回列表中的值列表
*/
values():IterableIterator;
[Symbol.iterator]():IterableIterator;
}
“NodeListOf”继承自“NodeList”,而“NodeList”具有“forEach”
方法,为什么“NodeListOf”上不存在“forEach”

无法保证此类型上会存在
forEach
——它可以,但不一定(例如在PhantomJS和IE中),因此TypeScript默认不允许它。为了对其进行迭代,您可以使用:

1) Array.from():

2) 例如:

老实说,您可以将NodeListOf转换为数组,这样typescript就不会抱怨nodelist.forEach,但这只是通过添加不必要的代码来解决问题。通过将dom.iterable库添加到tsconfig.json中,可以告诉typescript理解本机nodelist.forEach语法。下面是我的一个tsconfig.json文件的示例

{
  "compilerOptions": {
  "outDir": "./public/js/",
  "noImplicitAny": true,
  "module": "es6",
  "target": "es5",
  "allowJs": true,
  "moduleResolution": "node",
  "rootDir": "src",
  "lib": [
    "es6",
    "dom",
    "dom.iterable"
  ],
  "typeRoots": [
    "node_modules/@types"
  ],
  "removeComments": false
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules",
    "public",
    "**/*.spec.ts"
  ]
}

并不是所有浏览器都支持nodelist.forEach,所以我肯定会多填充它,因为它只存在于
数组中。我不知道你在找什么样的答案。使用
Array.from()
如果您想使用
forEach
@jhpratt
NodeList
有一个
forEach
方法:您确定答案2有效吗?我得到一个错误:“Type'NodeListOf'不是数组类型或字符串类型。”。你是对的,只有in-loop可以使用TypeScript,谢谢。我还必须添加
“downlevelIteration:true
编译器选项
,如前所述。如果要减小发出的JS文件大小,可以添加标志
importpers
noEmitHelpers
Array.from(checkboxes).forEach((el) => { /* do something */});
for (let i in checkboxes) {
  if (checkboxes.hasOwnProperty(i)) {
    console.log(checkboxes[i]);
  }
}
{
  "compilerOptions": {
  "outDir": "./public/js/",
  "noImplicitAny": true,
  "module": "es6",
  "target": "es5",
  "allowJs": true,
  "moduleResolution": "node",
  "rootDir": "src",
  "lib": [
    "es6",
    "dom",
    "dom.iterable"
  ],
  "typeRoots": [
    "node_modules/@types"
  ],
  "removeComments": false
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules",
    "public",
    "**/*.spec.ts"
  ]
}