Skip to content

Commit 005c18e

Browse files
authored
pref(createEventHook): optimize EventHookTrigger to support multiple parameters (#4111)
1 parent 5725a58 commit 005c18e

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

packages/shared/createEventHook/index.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,20 @@ describe('createEventHook', () => {
134134
off(listener)
135135
expect(listener).toBeCalledTimes(1)
136136
})
137+
138+
it('multiple parameters on trigger with types', () => {
139+
let id = ''
140+
const list: unknown[] = []
141+
const { on: onResult, trigger } = createEventHook<string>()
142+
143+
onResult(_id => id = _id)
144+
onResult((str, ...rest) => {
145+
list.push(str, ...rest)
146+
})
147+
148+
trigger('foo', 1, true, 'bar')
149+
150+
expect(id).toEqual('foo')
151+
expect(list).toEqual(['foo', 1, true, 'bar'])
152+
})
137153
})

packages/shared/createEventHook/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ import { tryOnScopeDispose } from '../tryOnScopeDispose'
88
// any extends void = true
99
// so we need to check if T is any first
1010
type Callback<T> = IsAny<T> extends true
11-
? (param: any) => void
11+
? (...param: any) => void
1212
: (
1313
[T] extends [void]
14-
? () => void
15-
: (param: T) => void
14+
? (...param: unknown[]) => void
15+
: (...param: [T, ...unknown[]]) => void
1616
)
1717

1818
export type EventHookOn<T = any> = (fn: Callback<T>) => { off: () => void }
1919
export type EventHookOff<T = any> = (fn: Callback<T>) => void
20-
export type EventHookTrigger<T = any> = (param?: T) => Promise<unknown[]>
20+
export type EventHookTrigger<T = any> = (...param: IsAny<T> extends true ? unknown[] : [T, ...unknown[]]) => Promise<unknown[]>
2121

2222
export interface EventHook<T = any> {
2323
on: EventHookOn<T>
@@ -49,7 +49,7 @@ export function createEventHook<T = any>(): EventHook<T> {
4949
}
5050

5151
const trigger: EventHookTrigger<T> = (...args) => {
52-
return Promise.all(Array.from(fns).map(fn => fn(...(args as [T]))))
52+
return Promise.all(Array.from(fns).map(fn => fn(...(args as [T, ...unknown[]]))))
5353
}
5454

5555
return {

0 commit comments

Comments
 (0)