如何在两个谓词中指定类型约束以具有相同的参数?

时间:2019-05-30 07:34:10

标签: typescript generics types

我想为一些自定义事件创建通用事件处理函数。

事件看起来像Event<T extends Function>,并具有addListenerremoveListener方法。然后像这样使用:type MyEvent = Event<(a1: string, a2: number) => void>

我的目标是创建一个带有两个参数的函数:此类事件和带有事件处理程序的具有相同参数的谓词。例如,一个参数:

export function myFunction<A1>(
    event: Event<(a1: A1) => void>,
    predicate: (a1: A1) => boolean): Promise<void> {

}

如何使该函数更通用,以便能够处理多个参数?

1 个答案:

答案 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