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
@jhprattNodeList
有一个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"
]
}