From 972a791b7e784ee14b9554e55ad3b28025448653 Mon Sep 17 00:00:00 2001 From: Carlos Rodrigues Date: Fri, 3 Nov 2023 15:41:36 +0000 Subject: [PATCH 1/2] types(jsx): Allow modifiers to jSX event --- packages/dts-test/tsx.test-d.tsx | 12 ++++++++++++ packages/runtime-dom/src/jsx.ts | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/dts-test/tsx.test-d.tsx b/packages/dts-test/tsx.test-d.tsx index 04915a9673f..56f8d2f73bb 100644 --- a/packages/dts-test/tsx.test-d.tsx +++ b/packages/dts-test/tsx.test-d.tsx @@ -30,6 +30,18 @@ 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) + }} /> ) diff --git a/packages/runtime-dom/src/jsx.ts b/packages/runtime-dom/src/jsx.ts index 7769418653e..3de06672382 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,12 @@ export interface Events { onTransitionstart: TransitionEvent } +type EventModifiers = 'Capture' | 'Once' | `OnceCapture` | 'CaptureOnce' + +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] From e76bcfadd80c9a64f583f326652fb0ec941ab786 Mon Sep 17 00:00:00 2001 From: Carlos Rodrigues Date: Fri, 3 Nov 2023 16:01:56 +0000 Subject: [PATCH 2/2] chore: add passive + combinations --- packages/dts-test/tsx.test-d.tsx | 16 ++++++++++++++++ packages/runtime-dom/src/jsx.ts | 19 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/dts-test/tsx.test-d.tsx b/packages/dts-test/tsx.test-d.tsx index 56f8d2f73bb..3432fdc1f21 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 3de06672382..790e84dc311 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]