Language-tools: 支持原生 DOM 元素上的自定义事件

创建于 2020-08-05  ·  4评论  ·  资料来源: sveltejs/language-tools

您的功能请求是否与问题有关?
尝试在本机 DOM 元素上添加自定义事件时出现以下错误:

Type '{ onswipestart: (event: CustomEvent<any>) => void; onswipemove: (event: CustomEvent<any>) => void; onswipeend: (event: CustomEvent<any>) => void; style: string; class: string; }' is not assignable to type 'HTMLProps<HTMLDivElement>'.
  Property 'onswipestart' does not exist on type 'HTMLProps<HTMLDivElement>'.ts(2322)

使用 Sveltes 操作/使用指令 https://svelte.dev/examples#actions 将自定义事件分派到div元素。

描述您想要的解决方案
能够对使用原生 DOM 元素上的 Svelte 操作调度的自定义事件进行类型检查。

描述您考虑过的替代方案
我可以尝试将 div 转换为单个 Svelte 组件,但最好它也应该适用于原生 DOM 元素。

附加上下文

The error message

这就是我收听自定义事件的方式:

<div
  class="bottomSheet"
  class:draggable
  bind:this={bottomSheet}
  use:swipeable
  on:swipestart={handleSwipeStart}
  on:swipemove={handleSwipeMove}
  on:swipeend={handleSwipeEnd}
  style="height:{height};bottom:{bottom};transform:translateY({$coords.ty}px);"
>

Svelte 组件上自定义事件的相关拉取请求: https ://github.com/sveltejs/language-tools/pull/303

enhancement

最有用的评论

不知道有没有办法让它只适用于带有动作的元素。 但是您可以像这样使其在全球范围内可用。

declare namespace svelte.JSX {
    interface HTMLAttributes<T> {
        onswipemove?: (event: CustomEvent<number> & { target: EventTarget & T }) => any;
    }
}

所有4条评论

不知道有没有办法让它只适用于带有动作的元素。 但是您可以像这样使其在全球范围内可用。

declare namespace svelte.JSX {
    interface HTMLAttributes<T> {
        onswipemove?: (event: CustomEvent<number> & { target: EventTarget & T }) => any;
    }
}

我们还可以通过“回退到CustomEvent<any>来增强我们的分型,但我宁愿不这样做,因为如果其他人错误输入事件,可能会依赖分型来抛出“不存在”错误。我会如果它只应用于带有动作的元素,那么可以接受,但我不确定我们将如何实现它。
我认为从动作中推断类型几乎是不可能完成的任务。 也许我们可以找到一种方法让用户明确地键入动作及其可能的事件。

谢谢,让用户明确键入操作或明确选择何时回退到CustomEvent<any>可能是最好的情况,但@jasonlyu123的解决方案现在对我来说已经足够好了。 感谢您做的伟大工作!

我又看了一遍,现在我对最好的前进方式存在分歧。

选项 1:静默错误

如果它是带有use:YY指令的 DOM 元素上的on:XX事件,我们可以使错误静音。 缺点是事件的类型为 any 隐式。 它也可能无法捕获所有情况,因为 Svelte 本质上是动态的,有人可以冒泡 CustomEvents。

选项 2:添加CustomEvent<any>后备

我们基本上会将& {[key: string]: CustomEvent<any>}添加到所有固有元素类型中。 这意味着上面未列出的 _any_ 属性将回退到CustomEvent<any> 。 这将解决选项 1 的“动态性质”问题和“隐含任何”问题。但如果有人使用像myownAttribute这样的自定义属性,这也是错误的。

选项 3:添加any后备

与选项 2 一样,只是我们添加了& {[key: string]: any}后备。 这意味着任何不适合的东西都会退回到任何东西。 这最符合 DOM 的动态特性,代价是不再捕获拼写错误。

此页面是否有帮助?
0 / 5 - 0 等级