From c17384b834e5ea390a4c19d47fb97770ac7eb7fa Mon Sep 17 00:00:00 2001 From: Ivan Hofer Date: Fri, 4 Feb 2022 17:04:39 +0100 Subject: [PATCH] improve types for `createEventDispatcher` --- src/runtime/internal/lifecycle.ts | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/runtime/internal/lifecycle.ts b/src/runtime/internal/lifecycle.ts index bb3df3d29526..b188111ba28b 100644 --- a/src/runtime/internal/lifecycle.ts +++ b/src/runtime/internal/lifecycle.ts @@ -27,12 +27,29 @@ export function onDestroy(fn: () => any) { get_current_component().$$.on_destroy.push(fn); } +type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void + ? I + : never + +type ExtractObjectValues> = Object[keyof Object] + +type ConstructDispatchFunction, EventKey extends keyof EventMap> = + EventMap[EventKey] extends never + ? (type: EventKey) => void + : (type: EventKey, detail: EventMap[EventKey]) => void + +type CreateDispatchFunctionMap = { + [Key in keyof EventMap]: ConstructDispatchFunction +} + +type EventDispatcher> = UnionToIntersection>> + export function createEventDispatcher< - EventMap extends {} = any ->(): >(type: EventKey, detail?: EventMap[EventKey]) => void { + EventMap extends Record = any +>(): EventDispatcher { const component = get_current_component(); - return (type: string, detail?: any) => { + return ((type: string, detail?: any) => { const callbacks = component.$$.callbacks[type]; if (callbacks) { @@ -43,7 +60,7 @@ export function createEventDispatcher< fn.call(component, event); }); } - }; + }) as EventDispatcher; } export function setContext(key, context: T) { @@ -59,7 +76,7 @@ export function getAllContexts = Map>(): T { } export function hasContext(key): boolean { - return get_current_component().$$.context.has(key); + return get_current_component().$$.context.has(key); } // TODO figure out if we still want to support