Typescript - 如何遍历 HTMLCollection
Typescript - 如何遍历 HTMLCollection
我对TypeScript还不熟悉,我正在尝试遍历通过document.getElementsByClassName()
获取到的HTMLCollection。我的代码是:
let tag_list = document.getElementsByClassName("...") as HTMLCollectionOf; for (const tag of tag_list) { //对tag.href做一些操作 }
但是出现了"TS2495: 类型 'HTMLCollectionOf' 不是数组类型或字符串类型。"这个错误。所以我应该如何防止这个错误的发生呢?
Typescript - 如何遍历HTMLCollection的原因及解决方法
在使用Typescript时,有时我们需要遍历一个HTMLCollection对象,然而Typescript并不直接支持对HTMLCollection的遍历,这就导致了遍历HTMLCollection的问题。
解决这个问题的方法是通过将HTMLCollection对象转换为其他类型来遍历。一种常用的方法是先将HTMLCollection对象转换为any
类型,然后再转换为我们想要的类型,如下所示:
for (const child of dom.children as any as HTMLElement[]) { .... }
这种方法虽然有些丑陋,但却相当有效。通过这种技巧,我们可以“欺骗”Typescript关于类型的判断。由于JavaScript可以轻松地遍历HTMLElement的子元素,通过这种方式欺骗Typescript,让JavaScript按照正常的方式进行遍历。
通过以上的方法,我们可以解决Typescript中遍历HTMLCollection对象的问题。希望这篇文章对你在开发过程中遇到的类似问题有所帮助。
Typescript - 如何迭代HTMLCollection
问题原因:
根据这个S.O.答案显示,这取决于编译设置。
解决方法:
1. 在tsconfig.json文件中进行以下设置:
{
"compileOnSave" : true,
"compilerOptions": {
"noImplicitAny" : true,
"target" : "ES2021",
"moduleResolution": "Node"
},
"exclude": [
"node_modules",
"dist"
]
}
2. 使用以下代码进行编译和运行:
const tds = document.getElementsByTagName('td') as HTMLCollectionOf; for( const td of tds ) { Utils.onClick( td, ( event: UIEvent ) => this.place( event, 1, 1 )); }
以上代码可解决在Typescript中如何迭代HTMLCollection的问题。
问题的出现原因是因为HTMLCollectionOf<HTMLLinkElement>不是一个数组,因此无法进行迭代。解决方法是将其转换为数组,然后进行迭代。
首先,我们可以使用Array.from()方法将HTMLCollectionOf<HTMLLinkElement>转换为数组。代码如下:
const tag_list_array = Array.from(tag_list);
接下来,我们可以使用for...of循环来遍历数组。代码如下:
for (const tag of tag_list_array) { // 进行迭代操作 }
这样就可以对HTMLCollection进行迭代操作了。
然而,在实际操作中可能会遇到一个错误:"Property 'from' does not exist on type 'ArrayConstructor.'"。这是因为TypeScript不支持Array.from()方法。
为了解决这个问题,我们可以手动定义ArrayConstructor接口,添加from()方法的定义。代码如下:
interface ArrayConstructor { from<T>(iterable: Iterable<T> | ArrayLike<T>): T[]; from<T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; }
通过添加这个接口定义,我们就可以在TypeScript中使用Array.from()方法了。
希望这篇文章对你有帮助!