根据您的 TypeScript 目标编译器,可能会出现解析错误。
for-of 循环是在 EcmaScript(ES6)的第六版中引入的,因此旧的浏览器 JS 引擎无法理解 for-of 循环语法。
https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/
要解决这个问题,
如果您仅支持最新的现代浏览器(>=ES6)
请更改您的 TS 目标。
{
"compilerOptions": {
"target": "es6"
}
}
如果您支持旧版浏览器(<=ES5)
我假设您正在使用下一个环境。
//.tsconfig.json
{
"compilerOptions": {
"target": "es5"
}
}
- 要使用as any语法来保持for-of循环
注意:“as any”会将集合(对象)强制转换为数组,并且这将影响“for”范围内的某些类型特性。
//.ts
const allSubMenus : NodeListOf<SpecifiedElement> = document.querySelectorAll('.subMenuItems')
for (const sub of allSubMenus as any){ // then will pass compiler
sub.classList.remove('active')
}
上面的TS脚本将被编译为:
var allSubMenus = document.querySelectorAll('.subMenuItems');
for (var _a = 0, _b = forms; _a < _b.length; _a++) {
var sub = _b[_a];
sub.classList.remove('active');
}
https://stackblitz.com/edit/node-ywn1bq?file=main.js
- 使用传统的for循环语法
const allSubMenus : NodeListOf<SpecifiedElement> = document.querySelectorAll('.subMenuItems')
for (let i = 0; i < allSubMenus.length; i++) {
allSubMenus[i].classList.remove('active');
}
<元素>
除了上述内容之外,为避免以下警告,
Property '<property name>' does not exist on type 'Element'
如果您知道元素类型并且类型定义存在,可以指定<Element>。
//for example,
NodeListOf<Element> => NodeListOf<HTMLFormElement>
ECMAScript(ES) 历史
https://codeburst.io/javascript-wtf-is-es6-es8-es-2017-ecmascript-dca859e4821c
for (let i = 0; i < allSubMenus.length; i++) { allSubMenus[i].classList.remove('active'); }
- Matt McCutchen