diff --git a/packages/shared/createEventHook/index.test.ts b/packages/shared/createEventHook/index.test.ts index ec7ccc86e5b..366164ec620 100644 --- a/packages/shared/createEventHook/index.test.ts +++ b/packages/shared/createEventHook/index.test.ts @@ -27,6 +27,18 @@ describe('createEventHook', () => { expect(message).toBe('Hello World') }) + it('should trigger event with no params', () => { + let timesFired = 0 + + const { on: onResult, trigger } = createEventHook() + + onResult(() => timesFired++) + trigger() + trigger() + + expect(timesFired).toBe(2) + }) + it('should add and remove event listener', () => { const listener = vi.fn() const { on, off, trigger } = createEventHook() diff --git a/packages/shared/createEventHook/index.ts b/packages/shared/createEventHook/index.ts index d9a4f535227..9f99ee7d339 100644 --- a/packages/shared/createEventHook/index.ts +++ b/packages/shared/createEventHook/index.ts @@ -4,9 +4,10 @@ */ import { tryOnScopeDispose } from '../tryOnScopeDispose' -export type EventHookOn = (fn: (param: T) => void) => { off: () => void } -export type EventHookOff = (fn: (param: T) => void) => void -export type EventHookTrigger = (param: T) => Promise +type Callback = T extends void ? () => void : (param: T) => void +export type EventHookOn = (fn: Callback) => { off: () => void } +export type EventHookOff = (fn: Callback) => void +export type EventHookTrigger = (param?: T) => Promise export interface EventHook { on: EventHookOn @@ -20,13 +21,13 @@ export interface EventHook { * @see https://vueuse.org/createEventHook */ export function createEventHook(): EventHook { - const fns: Set<(param: T) => void> = new Set() + const fns: Set> = new Set() - const off = (fn: (param: T) => void) => { + const off = (fn: Callback) => { fns.delete(fn) } - const on = (fn: (param: T) => void) => { + const on = (fn: Callback) => { fns.add(fn) const offFn = () => off(fn) @@ -37,8 +38,8 @@ export function createEventHook(): EventHook { } } - const trigger = (param: T) => { - return Promise.all(Array.from(fns).map(fn => fn(param))) + const trigger: EventHookTrigger = (param?: T) => { + return Promise.all(Array.from(fns).map(fn => param ? fn(param) : (fn as Callback)())) } return {