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
会导致错误?
为包装函数添加一个通用参数,以更改函数侦听器的签名,以便它采用剩余参数:
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;
}