typescript TS2339:类型“Element”上不存在属性“style”

zazmityj  于 2023-08-08  发布在  TypeScript
关注(0)|答案(8)|浏览(665)

代码如下:

const test = Array.from(document.getElementsByClassName('mat-form-field-infix'));
test.forEach((element) => {
    element.outerHTML = '<div class="good-day-today" style="width: 0px;"></div>'; // Please note that this line works fine!
    element.style.padding = '10px';
    element.style.borderTop = '0';
});

字符串
编译时出错:
src/app//.component.ts(101,21)中出现错误:错误TS 2339:类型“Element”上不存在属性“style”。src/app//.component.ts(102,21):错误TS 2339:类型“Element”上不存在属性“style”。
我该怎么解决?
我尝试删除Array.from...部分,尝试使用for offor in,尝试as any,但以上是我必须这样做的方式。

6kkfgxo0

6kkfgxo01#

你需要一个类型转换:

Array.from(document.getElementsByClassName('mat-form-field-infix') as HTMLCollectionOf<HTMLElement>)

字符串
这是因为getElementsByClassName只返回HTMLCollection<Element>,而Element没有style属性。然而,HTMLElement通过它的ElementCSSInlineStyle扩展接口实现了它。
请注意,这种类型转换是类型安全的,因为每个Element要么是HTMLElement,要么是SVGElement,我希望您的SVG Elements没有类。

qpgpyjmq

qpgpyjmq2#

另一种选择是使用querySelectorAll和类型参数。getElementsByClassName不是通用的,但是querySelectorAll是-你可以只传递将要被选择的元素的类型,像这样:

const test = document.querySelectorAll<HTMLElement>('.mat-form-field-infix');

字符串
这不需要任何类型转换,* 和 * 它将允许您立即使用forEach,而不是首先将其转换为数组。(getElementsByClassName返回一个HTMLCollection,它没有forEach方法; querySelectorAll返回一个NodeList,它确实有一个forEach方法,至少在最新的浏览器上是这样。为了支持古老的浏览器,你需要一个polyfill,或者先把它转换成数组。
如果你碰巧只需要一个元素,你可以使用querySelector,它也是通用的:

const elm = document.querySelector<HTMLElement>('.foo')!;
elm.style.padding = '10px';


querySelectorAll(和querySelector)的另一个好处是它们接受CSS选择器字符串,这可以更加灵活和精确。例如,选择器字符串

.container > input:checked


将选择<div class="container">的子项,这些子项是<input> s并被选中。

wqlqzqxt

wqlqzqxt3#

解决方法可能是这样做:

element["style"].padding = '10px';
element["style"].borderTop = '0';

字符串
也许这不是最好的解决方案,但它应该工作,我用了很多次:)

vjhs03f7

vjhs03f74#

也许这可以帮助:

let element = <HTMLElement> document.getElementsByClassName(className)[0];

字符串

eoxn13cs

eoxn13cs5#

当你设置outerHTML的时候,你就破坏了原来的元素。所以,你的造型不起作用。
您会注意到,如果将其更改为set innerHTML,样式 * 确实 * 有效。
这并没有做完全相同的事情,但我希望它能为您指明正确的方向。

const test = Array.from(document.getElementsByClassName('mat-form-field-infix'));
test.forEach((element) => {
    element.innerHTML = '<div class="good-day-today" style="width: 0px;"></div>'; // Please note that this line works fine!
    element.style.padding = '10px';
    element.style.borderTop = '0';
});

字符串

ahy6op9u

ahy6op9u6#

我也面临着类似的问题,而做

document.querySelectorAll(".<className>");

字符串
所以我没有添加style属性,而是通过添加另一个类来解决它。
示例:

//css file
    .<classname> {
        display: none;
      }
    .<classname>.show {
        display: flex;
      }

//ts file
elements.forEach((ele, index) => {
const errors = something.length;
if (index < errors) {
  ele.classList.add("show");
} else {
  ele.classList.remove("show");
}


}); };

mkshixfv

mkshixfv7#

我想我找到了一个更简单的方法:
只需创建一个index.d.ts文件并添加:

interface Element {
    style: CSSStyleDeclaration
}

字符串

6xfqseft

6xfqseft8#

Jonas Wilms的answer不是完全正确的(再也不是了?).
虽然我怀疑在这种情况下类型转换不会导致任何问题,但我仍然会尽可能避免类型转换。在这种情况下,可以使用instanceof narrowing避免类型转换:

const test = Array.from(
  document.getElementsByClassName('mat-form-field-infix')
)
test.forEach((element) => {
  if (!(element instanceof HTMLElement)) {
    return
  }

  element.outerHTML =
    '<div class="good-day-today" style="width: 0px;"></div>' // Please note that this line works fine!
  element.style.padding = '10px'
  element.style.borderTop = '0'
})

字符串

相关问题