Typescript ChildNode:“parentElement”和/或“parentNode”为空?
所以这是一个哲学问题。
在 TypeScript 中,ChildNode 可以没有父节点,因为
ChildNode.parentElement
和
ChildNode.parentNode
都有一个
null
类型选项。
但是作为
Child
Node,从本质上来说,它不是有一个父节点吗?我可以理解
parentElement
可能为
null
,因为它可能派生自非元素节点(或者这甚至是可能的),但至少
parentNode
不应该是非空的吗?
我理解这在
DOM 规范
中并没有明确指出,但如果
ChildNode
没有父节点,那会不会很奇怪?
如果将节点从父节点移开,情况是否也是如此?但这样的事情不会将
ChildNode
的类型更改为普通的
Node
吗?
我真的很想听听您对这个问题的见解,因为它让我有点困惑。
来自 https://developer.mozilla.org/en-US/docs/Web/API/ChildNode :
The
ChildNode
mixin contains methods and properties that are common to all types ofNode
objects that can have a parent. It's implemented byElement
,DocumentType
, andCharacterData
objects.
ChildNode 并不意味着“此节点当前有一个父节点”。它只是一个混合类,其他类型实现它来包含
remove()
、
before()
、
after()
和
replaceWith()
方法。
继承自 Node 但
不
混合 ChildNode 方法的类型的示例是
Document
。文档是一个节点(其子节点的
parentNode
就是其自身),但它永远不能有父节点,因此
document.remove()
会产生编译错误。
Is it like this in the case that you might move the node away from the parent? But wouldn't something like this change the type of the
ChildNode
, to plain ol'Node
?
TypeScript 的静态类型检查并非如此 - 在对象上调用
remove()
之类的方法不会改变其类型。(在 JavaScript 中,从技术上来说,更改对象的原型可能是可行的,但 TypeScript 不会对此进行建模。)节点仍然是删除之前所属的同一类的对象,因此它仍然会实现这些方法,即使在节点没有父节点时调用这些方法可能没有意义。事实上,由于
每个元素都是一个子节点
,在
element.remove()
之后动态更改类型是没有意义的,因为元素仍然应该是一个元素。