diff --git a/packages/dts-test/tsx.test-d.tsx b/packages/dts-test/tsx.test-d.tsx index 04915a9673f..3432fdc1f21 100644 --- a/packages/dts-test/tsx.test-d.tsx +++ b/packages/dts-test/tsx.test-d.tsx @@ -30,6 +30,34 @@ expectType( // infer correct event type expectType(e.target) }} + onInputCapture={e => { + expectType(e.target) + }} + onInputOnce={e => { + expectType(e.target) + }} + onInputOnceCapture={e => { + expectType(e.target) + }} + onInputCaptureOnce={e => { + expectType(e.target) + }} + onInputPassive={e => { + // infer correct event type + expectType(e.target) + }} + onInputCapturePassive={e => { + expectType(e.target) + }} + onInputOncePassive={e => { + expectType(e.target) + }} + onInputOnceCapturePassive={e => { + expectType(e.target) + }} + onInputPassiveCaptureOnce={e => { + expectType(e.target) + }} /> ) diff --git a/packages/runtime-dom/src/jsx.ts b/packages/runtime-dom/src/jsx.ts index 7769418653e..790e84dc311 100644 --- a/packages/runtime-dom/src/jsx.ts +++ b/packages/runtime-dom/src/jsx.ts @@ -1235,7 +1235,7 @@ export interface IntrinsicElementAttributes { view: SVGAttributes } -export interface Events { +export interface BaseEvents { // clipboard events onCopy: ClipboardEvent onCut: ClipboardEvent @@ -1351,6 +1351,29 @@ export interface Events { onTransitionstart: TransitionEvent } +// All possible combinations, could be generated programmatically but +// probably too much trouble for little gain, especially it will incur more overhead on the typing +type EventModifiers = + | 'Capture' + | 'Once' + | 'Passive' + | 'CaptureOnce' + | 'OnceCapture' + | 'CapturePassive' + | 'PassiveCapture' + | 'OncePassive' + | 'PassiveOnce' + | 'CaptureOncePassive' + | 'CapturePassiveOnce' + | 'OnceCapturePassive' + | 'OncePassiveCapture' + | 'PassiveCaptureOnce' + | 'PassiveOnceCapture' + +type Events = BaseEvents & { + [K in keyof BaseEvents as `${K & string}${EventModifiers}`]: BaseEvents[K] +} + type EventHandlers = { [K in keyof E]?: E[K] extends (...args: any) => any ? E[K]