创建图片轮播遇TS错误:Property 'style'不存在于类型'Element'
解决TypeScript中Element类型无style属性的错误(轮播组件场景)
问题场景
参照W3Schools教程实现图片自动轮播组件时,JavaScript代码在TypeScript环境中运行出现错误:Property 'style' does not exist on type 'Element'. ts(2339),错误集中在.style.display相关逻辑。
原HTML代码
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="script.js" ></script> </head> <body> <h2>Automatic Slideshow</h2> <p>Change image every 2 seconds:</p> <div class="slideshow-container"> <div class="mySlides fade"> <div class="numbertext">1 / 3</div> <img src="green.jpeg" alt="Trees"> <div class="text">Caption Text</div> </div> <div class="mySlides fade"> <div class="numbertext">2 / 3</div> <img src="map.jpeg" alt="Trees"> <div class="text">Caption Two</div> </div> <div class="mySlides fade"> <div class="numbertext">3 / 3</div> <img src="trees.jpeg" alt="Trees"> <div class="text">Caption Three</div> </div> </div> <br> <div style="text-align:center"> <span class="dot"></span> <span class="dot"></span> <span class="dot"></span> </div> </body> </html>
原JavaScript代码(TS环境报错)
let slideIndex = 0; showSlides(); function showSlides() { let i; let slides = document.getElementsByClassName("mySlides"); let dots = document.getElementsByClassName("dot"); for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } slideIndex++; if (slideIndex > slides.length) {slideIndex = 1} for (i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" active", ""); } slides[slideIndex-1].style.display = "block"; dots[slideIndex-1].className += " active"; setTimeout(showSlides, 2000); // Change image every 2 seconds }
错误原因
document.getElementsByClassName()返回的是HTMLCollectionOf<Element>类型,TypeScript中Element基类并不包含style属性——style是HTMLElement的专属属性,因此直接访问会触发类型校验错误。
解决方案
以下是三种可行的修复方式:
方式1:类型断言为HTMLElement
在访问style属性前,将元素断言为HTMLElement类型:
let slideIndex = 0; showSlides(); function showSlides() { let i; let slides = document.getElementsByClassName("mySlides"); let dots = document.getElementsByClassName("dot"); for (i = 0; i < slides.length; i++) { (slides[i] as HTMLElement).style.display = "none"; } slideIndex++; if (slideIndex > slides.length) {slideIndex = 1} for (i = 0; i < dots.length; i++) { (dots[i] as HTMLElement).className = (dots[i] as HTMLElement).className.replace(" active", ""); } (slides[slideIndex-1] as HTMLElement).style.display = "block"; (dots[slideIndex-1] as HTMLElement).className += " active"; setTimeout(showSlides, 2000); }
方式2:使用querySelectorAll并指定类型
querySelectorAll支持泛型参数,可以直接指定返回元素类型为HTMLElement,避免重复断言:
let slideIndex = 0; showSlides(); function showSlides() { let i; let slides = document.querySelectorAll<HTMLElement>(".mySlides"); let dots = document.querySelectorAll<HTMLElement>(".dot"); for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } slideIndex++; if (slideIndex > slides.length) {slideIndex = 1} for (i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" active", ""); } slides[slideIndex-1].style.display = "block"; dots[slideIndex-1].className += " active"; setTimeout(showSlides, 2000); }
方式3:给变量添加类型注解
直接给slides和dots变量指定HTMLCollectionOf<HTMLElement>类型:
let slideIndex = 0; showSlides(); function showSlides() { let i; let slides: HTMLCollectionOf<HTMLElement> = document.getElementsByClassName("mySlides") as HTMLCollectionOf<HTMLElement>; let dots: HTMLCollectionOf<HTMLElement> = document.getElementsByClassName("dot") as HTMLCollectionOf<HTMLElement>; for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } slideIndex++; if (slideIndex > slides.length) {slideIndex = 1} for (i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" active", ""); } slides[slideIndex-1].style.display = "block"; dots[slideIndex-1].className += " active"; setTimeout(showSlides, 2000); }
内容的提问来源于stack exchange,提问作者Mohamed Aly
相关产品推荐
相关产品推荐

