您的功能请求是否与问题有关?
尝试在本机 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 元素。
附加上下文
这就是我收听自定义事件的方式:
<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
不知道有没有办法让它只适用于带有动作的元素。 但是您可以像这样使其在全球范围内可用。
declare namespace svelte.JSX {
interface HTMLAttributes<T> {
onswipemove?: (event: CustomEvent<number> & { target: EventTarget & T }) => any;
}
}
我们还可以通过“回退到CustomEvent<any>
来增强我们的分型,但我宁愿不这样做,因为如果其他人错误输入事件,可能会依赖分型来抛出“不存在”错误。我会如果它只应用于带有动作的元素,那么可以接受,但我不确定我们将如何实现它。
我认为从动作中推断类型几乎是不可能完成的任务。 也许我们可以找到一种方法让用户明确地键入动作及其可能的事件。
谢谢,让用户明确键入操作或明确选择何时回退到CustomEvent<any>
可能是最好的情况,但@jasonlyu123的解决方案现在对我来说已经足够好了。 感谢您做的伟大工作!
我又看了一遍,现在我对最好的前进方式存在分歧。
如果它是带有use:YY
指令的 DOM 元素上的on:XX
事件,我们可以使错误静音。 缺点是事件的类型为 any 隐式。 它也可能无法捕获所有情况,因为 Svelte 本质上是动态的,有人可以冒泡 CustomEvents。
CustomEvent<any>
后备我们基本上会将& {[key: string]: CustomEvent<any>}
添加到所有固有元素类型中。 这意味着上面未列出的 _any_ 属性将回退到CustomEvent<any>
。 这将解决选项 1 的“动态性质”问题和“隐含任何”问题。但如果有人使用像myownAttribute
这样的自定义属性,这也是错误的。
any
后备与选项 2 一样,只是我们添加了& {[key: string]: any}
后备。 这意味着任何不适合的东西都会退回到任何东西。 这最符合 DOM 的动态特性,代价是不再捕获拼写错误。
最有用的评论
不知道有没有办法让它只适用于带有动作的元素。 但是您可以像这样使其在全球范围内可用。