I want to iterate over the results of
document.getElementsByTagName("...");
It returns an HTMLCollection
, not an array. So I can't simply use forEach
.
The following is possible but doesn't look very nice:
let elements = document.getElementsByTagName("...");
for (var i = 0, m = elements.length; i < m; i++) {
let element = elements[i];
}
For javascript, there exists pretty much the exact same question: For loop for HTMLCollection elements
And apparently, with the latest updates, modern browsers support:
var list = document.getElementsByClassName("events");
for (let item of list) {
log(item.id);
}
But the typescript compiler complains:
error TS2495: Type 'NodeListOf<HTMLParagraphElement>' is not an array type or a string type.
It still transpiles to proper Javascript though. It's even aware of what I'm doing here and doesn't just copy over the sourcecode. The compiled output is this:
var elements = main_div.getElementsByTagName("p");
for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {
var element = elements_1[_i];
}
This is great, since the generated code will be supported even on older browsers. But I would like to get rid of the error message.
My compilerOptions are this:
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"sourceMap": true,
"rootDir": "src",
"lib": [
"es2015",
"dom"
]
}
}
I did try to edit my lib options. This specific feature was a part of ES6 and has been reworked a few times. So I tested the various ecmascript versions in lib but couldn't find a working setup.