const labelEl: HTMLElement = document.createElement('label')
const isElOfNeededType = (el: HTMLElement): boolean =>
["INPUT", "TEXTAREA"].includes(el.tagName);
let result
if (isElOfNeededType(labelEl.nextElementSibling)) {
result = true
}
这是我的Playground:链接
1.为什么在labelEl.nextElementSibling
上出现此错误?
类型“Element”的参数不能分配给类型“HTMLElement”的参数HTMLElement
不是Element
的扩展吗?
- 2.(不是很重要,但如果解释会很高兴)* 为什么TS playground抱怨
[ ].includes
,而我设置了Config -> Target = esnext
?
2条答案
按热度按时间yiytaume1#
labelEl.nextElementSibling
的类型为Element
。请参见Definitely Typed中的定义。因此,您的代码试图传递Element
,其中需要HTMLElement
。正如你所说,
HTMLElement
扩展了Element
,但这意味着你可以传递一个Element
来代替HTMLElement
,因为Element
可能没有HTMLElement
的属性。但是,您可以在需要Element
的地方传递HTMLElement
,因为HTMLElement
将具有Element
的所有属性。既然你只对
Element
上的tagName
属性感兴趣,我就把你的代码改为使用Element
。vptzau2j2#
我也有这个问题,尽管背景不同。
正如@Colliere之前的answered一样,问题在于
.nextElementSibling
返回的是Element
,而我们通常需要它作为HTMLElement
。一个简单的解决方案是在使用HTMLElement之前将其类型更改为HTMLElement。
在你的例子中,你可以像这样使用类型Assert:
我使用JSDOC,所以我必须使用JSDOC类型转换(注意额外的括号):