Stencil:将“@Method”添加到组件后突然出现构建错误而没有消息

Stencil: Sudden build error without message after adding `@Method` to component

我不能在这里提供太多信息(因为真的没有),但只有这个:

突然之间,在向模板组件添加 @Method 功能后:

@Method()
async setMenuItems(items: Element[]): Promise<void> {
  // code here
} 

组件停止编译并出现以下错误 - 真的没有用 - 错误:

[ ERROR ]  ./src/components/menu-content/menu-content.tsx:63:44
           build error

     L62:  @Method()
     L63:  async setMenuItems(elements: Element[]): Promise<void> {
     L64:    const unsupportedChildren = elements.filter(e => !this.isSupportedChild(e)).map(e => e.tagName);

[12:37.1]  build failed in 7.02 s

注意事项

我已经试过了...

我记得我曾经有过这个错误,显然我以某种方式修复了它(或者没有,idk)。但是如果我这样做了,我不记得是怎么做到的。

有没有人知道如何调试这个 - 或者更好地修复?

我明白了。我的组件的更完整版本是:

import { Element, ... } from '@stencil/core';

class MenuContent {
  @Element() element: MenuContentElement;

  @Method()
  setMenuItems(elements: Element[]): Promise<void> {
    // ------------------^^^^^^^
    // Element is meant to be the built-in browser interface for Element
    // but stencil thinks that this is the imported Element from '@stencil/core'!
  }
}

这里的确切问题是,模板编译器似乎假定 elements 参数是从 @stencil/core 导入的 Element 类型,这显然是错误的并导致对于这个奇怪的无用错误。

可能的解决方案

1。为内置 Element 类型

使用别名类型
// types.ts
export type DomElement = Element;

// menu-content.tsx
import { DomElement } from './types';
...
async setMenuItems(elements: DomElement[]): Promise<void> { ... }

2。切换到 HTMLElement

注意:这只是合法的,当您不需要支持其他元素类型时,例如 SVGElements!

async setMenuItems(elements: HTMLElement[]): Promise<void> { ... }

3。在导入语句中使用别名

请注意:当使用@stencil eslint规则时,他们会抱怨你重命名的import并说“own class members are not allowed to be public".

我在这里为它创建了一张票:https://github.com/ionic-team/stencil-eslint/issues/28

import { Element as ElementDecorator} from '@stencil/core';

class MenuContent {
  // eslint will complain about that:
  // "Own class properties cannot be public."
  @ElementDecorator() element: HTMLMenuContentElement;
}