打字稿:将 HTMLElement 转换为节点

Posted

技术标签:

【中文标题】打字稿:将 HTMLElement 转换为节点【英文标题】:Typescript: Convert HTMLElement to Node 【发布时间】:2019-10-26 00:26:39 【问题描述】:

如何将htmlElement 转换为Node 元素。

根据这个答案 (https://***.com/a/9979779/639035) a An element is one specific type of node... 但我找不到转换它们的方法。

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

【问题讨论】:

【参考方案1】:

最好的方法是将您的HTMLElement 转换为Node。有两种方法可以做到这一点。第一个是as 语法。

let myNode = theHTMLElement as Node;

您也可以使用<> 语法。

let myNode = <Node>theHTMLElement;

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

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

【讨论】:

【参考方案2】:

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

lib.dom.d.ts(Angular 使用的类型定义库)中,MutationObserver 对象的定义不太正确:

interface MutationObserver 
    disconnect(): void;
    observe(target: Node, options: MutationObserverInit): void;
    takeRecords(): MutationRecord[];

其中target 定义为Node 元素。

HTMLElement 是在同一个文件中定义的,它扩展了Element,它扩展了Node。所以HTMLElement 放入目标属性应该没有任何问题。

更好的类型定义是:

observe<T extends Node>(target: T, options: MutationObserverInit): void;

但由于尚未提供此类型定义,因此最好告诉编译器只需在回调中传递 element as Node 就可以了。

【讨论】:

谢谢,我稍后会为此创建一个错误:) 不确定是否是错误,也可能是预期行为 也许吧,但我看不出原因,所以它看起来很大。毕竟狼在旁边是一个很小的变化【参考方案3】:

您可以将 HTML 转换为字符串,然后使用此方法转换字符串:

const stringHTML = '<div>One</div><div>Two</div>';
const fragment = document.createRange().createContextualFragment(stringHTML);
console.log(fragment);

也许这个链接会有所帮助:convert-html-stings-dom-nodes

还有另一种称为 DOM 解析器的方法。它在链接中进行了解释。希望对您有所帮助。

【讨论】:

以上是关于打字稿:将 HTMLElement 转换为节点的主要内容,如果未能解决你的问题,请参考以下文章

如何将打字稿界面转换为棱镜模型

打字稿将联合转换为交集[重复]

将 JSON 转换为数组打字稿

将打字稿类转换为对象

如何将 Storybook 打字稿元声明转换为 MDX?

打字稿:将帖子请求正文转换为地图