打字稿和自定义元素属性编译问题

时间:2018-10-07 07:15:17

标签: javascript typescript custom-element

我有以下自定义元素:

class CustomElement extends HTMLElement{
 constructor(){ super(); }
config: ConfigModel;
}
window.customElements.define('my-element', CustomElement);

然后,在代码中的某处,我有这样的内容:

const myElement = document.createElement('my-element');
myElement.config = config;

TS在这里抛出错误: error TS2339: Property 'config' does not exist on type 'HTMLElement'.

有什么办法解决这个问题吗?

编辑:建议强制转换元素的类型。虽然这样做有效,但确实带来了两个问题:

  1. 我不一定要使用自定义元素的所有服务 了解自定义元素的类
  2. 如果我嘲笑风俗 测试元素,服务中的硬编码自定义元素 不允许嘲笑。

以下是要点:https://gist.github.com/YonatanKra/de42be2fa5499157169ef141ba377998

2 个答案:

答案 0 :(得分:1)

您需要将元素强制转换为预期的类型,因为在这种情况下Typescript无法识别类型。

document.createElement('my-element') as CustomElement

还需要继承CustomElement中的HTMLElement类:

const myElement = <CustomElement>document.createElement('my-element');

根据其他问题编辑的答案:

很显然,如果您想访问class CustomElement extends HTMLElement { 对象的属性,则需要键入强制类型转换。但是,在所有其他情况下,您都可以使用默认的CustomElement类型。它仍然应该允许您对对象执行某些操作,而与HTMLElement无关。因此,并非每个服务都需要知道它是一个CustomElement对象。

对于模拟,您可以创建一个CustomElement继承的CustomElementMock

CustomElement

模拟版本仍为class CustomElementMock extends CustomElement { } 类型,您的原始代码仍应接受。但是,在模拟类内部,您可以覆盖所有功能以执行任何操作或返回模拟数据。

答案 1 :(得分:0)

使用List[(Char, Int)]().maxByOption(_._1).getOrElse(('a', 1)) // (Char, Int) = (a,1)