<code>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;
}
</code>
<code>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;
}
</code>
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;
}
Playground
This code causes the error:
<code>A spread argument must either have a tuple type or be passed to a rest parameter. (2556)
</code>
<code>A spread argument must either have a tuple type or be passed to a rest parameter. (2556)
</code>
A spread argument must either have a tuple type or be passed to a rest parameter. (2556)
at line 17:
The wrapperFunc
above works fine, but why does wrap
cause an error?
New contributor
Rhseung is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
3
Add one more generic parameter for wrap function to change function listener’s signature so that it takes rest parameter:
<code>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;
}
</code>
<code>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;
}
</code>
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;
}
Playground