diff --git a/packages/runtime-core/src/h.ts b/packages/runtime-core/src/h.ts
index 93e7fd9bc..b3b4c8eef 100644
--- a/packages/runtime-core/src/h.ts
+++ b/packages/runtime-core/src/h.ts
@@ -75,8 +75,14 @@ interface Constructor
{
new (...args: any[]): { $props: P }
}
+type CombineModifiers = T extends any
+ ? T | `${T}${CombineModifiers>}`
+ : never
+
+type EventModifiers = CombineModifiers<'Capture' | 'Once' | 'Passive'> | ''
+
type HTMLElementEventHandler = {
- [K in keyof HTMLElementEventMap as `on${Capitalize}`]?: (
+ [K in keyof HTMLElementEventMap as `on${Capitalize}${EventModifiers}`]?: (
ev: HTMLElementEventMap[K],
) => any
}
diff --git a/packages/runtime-dom/src/jsx.ts b/packages/runtime-dom/src/jsx.ts
index 5292441cd..f32d80d31 100644
--- a/packages/runtime-dom/src/jsx.ts
+++ b/packages/runtime-dom/src/jsx.ts
@@ -252,7 +252,7 @@ export type StyleValue =
| CSSProperties
| Array
-export interface HTMLAttributes extends AriaAttributes, EventHandlers {
+export interface HTMLAttributes extends AriaAttributes, EventHandlers {
innerHTML?: string
class?: any
@@ -808,7 +808,7 @@ export interface WebViewHTMLAttributes extends HTMLAttributes {
webpreferences?: string
}
-export interface SVGAttributes extends AriaAttributes, EventHandlers {
+export interface SVGAttributes extends AriaAttributes, EventHandlers {
innerHTML?: string
/**
@@ -1384,10 +1384,14 @@ export interface Events {
onTransitionstart: TransitionEvent
}
-type EventHandlers = {
- [K in keyof E]?: E[K] extends (...args: any) => any
- ? E[K]
- : (payload: E[K]) => void
+type CombineModifiers = T extends any
+ ? T | `${T}${CombineModifiers>}`
+ : never
+
+type EventModifiers = CombineModifiers<'Capture' | 'Once' | 'Passive'> | ''
+
+type EventHandlers = {
+ [K in keyof Events as `${K}${EventModifiers}`]?: (payload: Events[K]) => void
}
import type { VNodeRef } from '@vue/runtime-core'