From 9729ab5e645d889227235ecb95162bbe6c7b11c1 Mon Sep 17 00:00:00 2001 From: 07akioni <07akioni2@gmail.com> Date: Tue, 9 Feb 2021 13:14:12 +0800 Subject: [PATCH] types: jsx capture, once & once capture --- packages/runtime-dom/types/jsx.d.ts | 18 ++++++++++++++++-- test-dts/tsx.test-d.tsx | 9 +++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/runtime-dom/types/jsx.d.ts b/packages/runtime-dom/types/jsx.d.ts index 8a2b17f0056..567ba43ce3c 100644 --- a/packages/runtime-dom/types/jsx.d.ts +++ b/packages/runtime-dom/types/jsx.d.ts @@ -1309,8 +1309,22 @@ export interface Events { type StringKeyOf = Extract -type EventHandlers = { - [K in StringKeyOf]?: E[K] extends Function ? E[K] : (payload: E[K]) => void +type ExtendBaseEventName = T extends `on${string}` + ? T | `${T}Capture` | `${T}Once` | `${T}OnceCapture` + : unknown +type ExtractBaseEventName = T extends `${infer OC}OnceCapture` + ? OC + : T extends `${infer O}Once` + ? O + : T extends `${infer C}Capture` + ? C + : T +type EventNames = ExtendBaseEventName> + +type EventHandlers> = { + [K in EventNames]?: E[ExtractBaseEventName] extends Function + ? E[ExtractBaseEventName] + : (payload: E[ExtractBaseEventName]) => void } // use namespace import to avoid collision with generated types which use diff --git a/test-dts/tsx.test-d.tsx b/test-dts/tsx.test-d.tsx index 43a2464b859..295f5140fff 100644 --- a/test-dts/tsx.test-d.tsx +++ b/test-dts/tsx.test-d.tsx @@ -25,6 +25,15 @@ expectType( // infer correct event type expectType(e.target) }} + onInputCapture={e => { + expectType(e.target) + }} + onInputOnce={e => { + expectType(e.target) + }} + onInputOnceCapture={e => { + expectType(e.target) + }} /> )