diff --git a/packages/dts-test/tsx.test-d.tsx b/packages/dts-test/tsx.test-d.tsx index 56f8d2f73..3432fdc1f 100644 --- a/packages/dts-test/tsx.test-d.tsx +++ b/packages/dts-test/tsx.test-d.tsx @@ -42,6 +42,22 @@ expectType( 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 3de066723..790e84dc3 100644 --- a/packages/runtime-dom/src/jsx.ts +++ b/packages/runtime-dom/src/jsx.ts @@ -1351,7 +1351,24 @@ export interface BaseEvents { onTransitionstart: TransitionEvent } -type EventModifiers = 'Capture' | 'Once' | `OnceCapture` | 'CaptureOnce' +// 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]