如何保护ChildNode?还是使用带有Typescript的ChildNode方法?

时间:2019-06-28 17:07:02

标签: angular typescript dom

我想使用ChildNode方法。如果是前我保护它:

const node = window.getSelection().getRangeAt(0).startContainer;

if (this.isChildNode(node)) {
  this.node.replaceWith(...);
}

isChildNode(node: Node): node is ChildNode {
  return 'replaceWith' in node;
}

抛出错误:

  

类型谓词的类型必须可分配给其参数的类型。   类型'ChildNode'不可分配给类型'Node'。属性“ baseURI”   类型'ChildNode'中缺少

如果我只是投放它:

const node = window.getSelection().getRangeAt(0).startContainer;
(node as ChildNode).replaceWith(...nodes)

抛出错误:

  

类型“节点”不能转换为类型“ ChildNode”

     

类型“节点”中缺少属性“删除”

只有any会编译应用程序:

(node as any).replaceWith(...nodes)

Stackblitz demo

令我困惑的是,ChldNode docs in MDN指出ChildNode没有继承任何属性或方法。那么extends Node在Typescript中如何...?

1 个答案:

答案 0 :(得分:0)

为什么没有人建议在typeguard检查后进行投射?它完全可以安全地在那里进行编译...

const node = window.getSelection().getRangeAt(0).startContainer;

if (this.isChildNode(node)) {
  (this.node as ChildNode).replaceWith(...nodes)
}

isChildNode(node: Node): node is ChildNode {
  return 'replaceWith' in node;
}