如何在不更改 Typescript 中的泛型类型的情况下包装函数?
function x() {
console.log('Original Function');
}
function wrapper<T extends Function>(func: T): T {
// Typescript compiler error:
// Type '() => void' is not assignable to type 'T'.
return () => {
console.log('Wrapped Function');
func.call(null);
}
}
const xWrapped = wrapper(x);
xWrapped(); // logged 'Wrapped Function' & 'Original Function'
最佳答案
这里有一个替代方案,它保留参数并返回内部函数的类型,而不依赖于可变参数类型。
function x(message: string): void {
console.log(`inner ${message}`);
}
export function wrapper<Args extends any[], Return>(
operation: (...operationParameters: Args) => Return,
...parameters: Args
): Return {
console.log(`outer `);
return operation(...parameters);
}
x("abc");
wrapper(x, "xyz");
// output:
//
// inner abc
// outer
// inner xyz
当 wrapper
用 x
调用, TS 编译器将其类型推断为 function wrapper<[string], void>(operation: (operationParameters_0: string) => void, parameters_0: string): void
.
如果您尝试调用 wrapper(x, 123)
,它以漂亮的类型安全失败:Argument of type '123' is not assignable to parameter of type 'string'.
关于具有通用类型的 Typescript 包装函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020874/