TS2339:类型“元素”上不存在属性“样式”

Ama*_*day 22 javascript typescript

这是代码:

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';
});
Run Code Online (Sandbox Code Playgroud)

编译时出现错误:

src/app/ / .component.ts(101,21) 中的错误:错误 TS2339:“元素”类型上不存在属性“样式”。src/app/ / .component.ts(102,21): 错误 TS2339: 类型“元素”上不存在属性“样式”。

我该如何解决?

我试图移除Array.from...零件,尝试使用for offor in,尝试过as any,但以上是我必须这样做的方式。

Jon*_*lms 55

你需要一个类型转换:

Array.from(document.getElementsByClassName('mat-form-field-infix') as HTMLCollectionOf<HTMLElement>)
Run Code Online (Sandbox Code Playgroud)

那是因为getElementsByClassName 只返回 HTMLCollection<Element>,并且Element没有style属性。该HTMLElement但是不执行它通过它的ElementCSSInlineStyle扩展接口。

请注意,这种类型转换是类型安全的,因为 everyElement要么是 a 要么是HTMLElementan SVGElement,我希望您的SVG 元素没有类。

  • 我必须使用 [`HTMLCollectionOf&lt;HTMLElement&gt;`](http://www.typescriptlang.org/play/?ssl=1&amp;ssc=1&amp;pln=5&amp;pc=4#code/MYewdgzgLgBFCm0YF4YEEBOGCGBPAdAGYYgC2AFACYjACup8YU+A5vFAKIA28DTEAIVwBhLtggQAtgbkA5KWxQAtIRAZSq gJbwulZVrCEtADzkBKGOJgAJACoBZADLCQXHsChbwAeUIAee2duXkYoAD5zAG4AKARoInUObGAAC3JyXVCmS2RwmaABvGJgSmCy+ZmhcHnwAB2xKSkMWFBg5AEYABlqzWNKyngr8KpqAI3VKeAw7EFrWuU65WIB faKA)来完成这项工作。 (2认同)
  • @JakeHolzinger 完全正确,正忙于寻找 Element 和 HTMLElement 的原因...... (2认同)

Cer*_*nce 37

另一种选择是使用querySelectorAll和类型参数。getElementsByClassName不是通用的,而是querySelectorAll- 您可以只传递将被选择的元素的类型,如下所示:

const test = document.querySelectorAll<HTMLElement>('.mat-form-field-infix');
Run Code Online (Sandbox Code Playgroud)

这不需要任何类型转换,并且它可以让你使用forEach立即,而不是首先将其转换为一个数组。(getElementsByClassName返回的HTMLCollection,其中没有一个forEach方法querySelectorAll返回一个NodeList,它确实有一个forEach方法,至少在一定程度上最新的浏览器支持古老的浏览器也一样,你需要一个。填充工具,或将其转换为数组优先。)

如果您碰巧只需要一个元素,则可以使用querySelector,这也是通用的:

const elm = document.querySelector<HTMLElement>('.foo')!;
elm.style.padding = '10px';
Run Code Online (Sandbox Code Playgroud)

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

.container > input:checked
Run Code Online (Sandbox Code Playgroud)

将选择<div class="container">其中为<input>s 并已检查的子项。


小智 5

解决方法可能是这样做:

element["style"].padding = '10px';
element["style"].borderTop = '0';
Run Code Online (Sandbox Code Playgroud)

也许这不是最好的解决方案,但它应该有效,我使用了多次:)

  • 在这种情况下,它表示:元素隐式具有“any”类型,因为“style”类型的表达式不能用于索引类型“Node”。类型“Node”.ts(7053) 上不存在属性“style” - 使用 eslint-plugin v 5.2.0 (4认同)