[英]Typescript wrapping function with generic type
如何在不更改 Typescript 中的通用類型的情況下包裝 function?
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'
如何在不更改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'
如何在不更改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 wrapFunction<TArgs extends any[], TReturn>(
targetFunction: (...parameters: TArgs) => TReturn,
): (...parameters: TArgs) => TReturn {
return (...parameters: TArgs) => {
console.log(`Hello, what is your name?`);
return targetFunction(...parameters);
};
}
// --------------- Example
const someFunction = (name: string) => {
console.log(`Hey! My name is ${name}.`);
}
const wrappedFunction = wrapFunction(someFunction);
wrappedFunction("Fábio");
輸出
[LOG]: "Hello, what is your name?"
[LOG]: "Hey! My name is Fábio."
或者,如果你想要更通用的東西:
export function wrapFunction<TArgs extends any[], TReturn>(
targetFunction: (...parameters: TArgs) => TReturn,
wrapperFunction: (...parameters: TArgs) => void,
): (...parameters: TArgs) => TReturn {
return (...parameters: TArgs) => {
wrapperFunction(...parameters);
return targetFunction(...parameters);
};
}
// --------------- Example
const someFunction = (name: string) => {
console.log(`Hey! My name is ${name}.`);
}
const wrapperFunction = (name: string) => {
console.log(`The wrapper - Hey! My name is ${name}.`);
}
const wrappedFunction = wrapFunction(someFunction, wrapperFunction);
wrappedFunction("Fábio");
輸出
[LOG]: "The wrapper - Hey! My name is Fábio."
[LOG]: "Hey! My name is Fábio."
這是我發現的另一種方式。 它甚至保留了包裝的 function 的 generics:
const newFunction = ((one, two) => {
// something before
const result = oldFunction(one, two)
// something after
return result
}) as typeof oldFunction
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.