我想为一些自定义事件创建通用事件处理函数。
事件看起来像Event<T extends Function>
,并具有addListener
和removeListener
方法。然后像这样使用:type MyEvent = Event<(a1: string, a2: number) => void>
。
我的目标是创建一个带有两个参数的函数:此类事件和带有事件处理程序的具有相同参数的谓词。例如,一个参数:
export function myFunction<A1>(
event: Event<(a1: A1) => void>,
predicate: (a1: A1) => boolean): Promise<void> {
}
如何使该函数更通用,以便能够处理多个参数?
答案 0 :(得分:1)
您可以在rest参数中使用元组来做到这一点:
export function myFunction<A extends any[]>(
event: Event<(...a: A) => void>, // A will be a tuple of parameter types inferred from here
predicate: (...a: A) => boolean): Promise<void>{
return Promise.resolve();
}
declare let e: Event<(v: string, n: number) => void>;
myFunction(e, (v, n) => v.length > 0 && n > 0); // v, n typed correctly
myFunction(e, (v) => v.length > 0); // fewer args allowed as usually in TS
myFunction(e, (v, n, z) => v.length > 0); // error here