Typescript:将 HTMLElement 转换为 Node

Ste*_*fan 5 javascript typescript htmlelements

如何将 a 转换HTMLElementNode元素。

根据这个答案(/sf/answers/698584561/)a ...An element is one specific type of node但我找不到转换它们的方法。

我特别需要一个 Node 元素,将其传递到 a MutationObserver( https://nitayneeman.com/posts/listening-to-dom-changes-using-mutationobserver-in-angular/ ),并且 aHTMLElement会引发错误。

D. *_*ell 8

执行此操作的最佳方法是将您的转换HTMLElementNode. 有两种方法可以做到这一点。首先是as语法。

let myNode = theHTMLElement as Node;
Run Code Online (Sandbox Code Playgroud)

您还可以使用<>语法。

let myNode = <Node>theHTMLElement;
Run Code Online (Sandbox Code Playgroud)

注意:这会在 TypeScript 编译时更改类型,但不会神奇地为您提供 .js 的 JS 方法和属性Node

它本质上允许您在知道可以的情况下绕过类型安全。如果类型不兼容,TypeScript 会尽力警告您,但如果您不小心,仍然可能会引入错误。


Cri*_*ìna 3

TypeScript 只为已经存在的对象提供类型定义,它不能修改对象的性质。所以,你的问题是关于 javascript 而不是关于 typescript。

\n\n

lib.dom.d.ts(Angular 使用的类型定义库)内部,MutationObserver\xc2\xa0object 的定义不太正确:

\n\n
interface MutationObserver {\n    disconnect(): void;\n    observe(target: Node, options: MutationObserverInit): void;\n    takeRecords(): MutationRecord[];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中target定义为Node元素。

\n\n

HTMLElement是在同一个文件中定义的,并且它Element扩展了Node. 因此,HTMLElement适合目标属性应该不会有任何问题。

\n\n

更好的类型定义是:

\n\n
observe<T extends Node>(target: T, options: MutationObserverInit): void;\n
Run Code Online (Sandbox Code Playgroud)\n\n

但由于尚未提供此类型定义,因此如果您告诉编译器只需在element as Node回调内传递就完全没问题,那就更好了。

\n