我试图定义一个可以包装任意函数的函数,同时保留参数类型和返回类型.我让它在函数没有泛型的情况下工作,但我很难让它与泛型一起工作.下面是一个简化的例子:
function wrap<F extends (...args: any[]) => any>(test: F) {
return (...args: Parameters<typeof test>): ReturnType<typeof test> => {
return test(...args);
};
}
function simpleTest(a: number): number {
return a;
}
// works
// type: (a: number) => number
const wrappedSimpleTest = wrap(simpleTest);
function genericTest<T>(a: T): T {
return a;
}
// doesn't work
// type: (a: unknown) => unknown
// desired type: <T>(a: T) => T
const wrappedGenericTest = wrap(genericTest);
function genericTest2<T, U>(a: T, b: U): T|U {
return Math.random() < 0.5 ? a : b;
}
// doesn't work
// type: (a: unknown, b: unknown) => unknown
// desired type: <T, U>(a: T, b: U) => T|U
const wrappedGenericTest2 = wrap(genericTest2);