错误:通用事件侦听器包装器中的“扩展参数必须具有元组类型”

问题描述 投票:0回答:1
function existingFunc(arg1: number, arg2: string): number {
    return arg1 + arg2.length;
}

function wrapperFunc(...args: Parameters<typeof existingFunc>): ReturnType<typeof existingFunc> {
    return existingFunc(...args);
}

type EventMap = {
    DEBUG: (msg: string) => number;
    TICK: (num: number, num2: number) => string;
    NOTI: () => number;
};

function wrap<E extends keyof EventMap> (event: E, listener: EventMap[E]) {
    const wrapped = (...args: Parameters<typeof listener>) => {
        listener(...args);
    }

    return wrapped;
}

游乐场

此代码导致错误:

A spread argument must either have a tuple type or be passed to a rest parameter. (2556)

第 17 行:

上面的

wrapperFunc
工作正常,但是为什么
wrap
会导致错误?

typescript
1个回答
0
投票

为包装函数添加一个通用参数,以更改函数侦听器的签名,以便它采用剩余参数:

type EventMap = {
    DEBUG: (msg: string) => number;
    TICK: (num: number, num2: number) => string;
    NOTI: () => number;
};

function wrap<E extends keyof EventMap, F extends ((...args: [...Parameters<EventMap[E]>]) => ReturnType<EventMap[E]>)> (event: E, listener: F) {
    const wrapped = (...args: Parameters<F>) => {
        listener(...args);
    };

    return wrapped;
}

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.