可以使用TS修饰器将函数定义 Package 到try-Catch块中吗?我不想在每个函数中都使用Try-Catch,所以我在想也许装饰者可以提供帮助。例如
function examleFn(errorWrapper: any) { try{ // some code } catch (err) { errorWrapper(err) } }
这样的事情可以在装饰器中完成,这样它也可以用于其他功能。
bttbmeg01#
不,您不能修饰函数。
TypeScrip的修饰符实现只能应用于类、类方法、类访问器、类属性或类方法参数。相关的proposal for JavaScript decorators(截至今天的the TC39 Process阶段3,2022-07-21)也不允许进行装饰功能。
功能装饰器被认为是装饰器提案的可能扩展,但目前不是任何针对TypeScrip或Java脚本的提案的一部分。
当然,您可以在另一个函数上调用类似修饰符的函数,但这只是一个更高阶的函数,而不是修饰符本身,它不会影响原始函数声明:
const makeErrorWrapper = <T,>(errorHandler: (err: any) => T) => <A extends any[], R>(fn: (...a: A) => R) => (...a: A): R | T => { try { return fn(...a); } catch (err) { return errorHandler(err); } };
makeErrorWrapper函数接受错误处理程序并返回一个新函数,该函数用该错误处理程序 Package 其他函数:
makeErrorWrapper
const errToUndefined = makeErrorWrapper(err => undefined);
所以现在errToUndefined是一个函数 Package 器。假设我们有以下抛出错误的函数:
errToUndefined
function foo(x: string) { if (x.length > 3) throw new Error("THAT STRING IS TOO LONG"); return x.length; } // function foo(x: string): number
如果直接调用,可能会得到运行时错误:
console.log(foo("abc")); // 3 console.log(foo("abcde")); // 💥 THAT STRING IS TOO LONG
相反,您可以将其 Package 起来:
const wrappedFoo = errToUndefined(foo); // const wrappedFoo: (x: string) => number | undefined
现在,wrappedFoo是一个新函数,其行为与foo类似,并采用与foo相同的参数列表,但返回number | undefined,而不仅仅是number:
wrappedFoo
foo
number | undefined
number
console.log(wrappedFoo("abc")) // 3 console.log(wrappedFoo("abcde")) // undefined
Playground链接到代码
3okqufwl2#
也许这能帮到你,我花了很长时间才做到这一点,但它在这里
function Execpetion (methodName: string) { return (target: any, nameMethod: string, descriptor: PropertyDescriptor) => { const originalMethod = descriptor.value descriptor.value = async function (...args: any[]) { try { const executionMethod = await originalMethod.apply(this, args) return executionMethod } catch (error) { return errorWrapper(error as Error) } } } }
在你的班上
class TestController { @Execpetion('TestController') public async handler (teste: any) { return { statusCode: 200, data: 'nothing' } } }
使用父函数,您可以修改和添加以接收errorPersonalized和示例化的类型参数...在回执上写上它
2条答案
按热度按时间bttbmeg01#
不,您不能修饰函数。
TypeScrip的修饰符实现只能应用于类、类方法、类访问器、类属性或类方法参数。相关的proposal for JavaScript decorators(截至今天的the TC39 Process阶段3,2022-07-21)也不允许进行装饰功能。
功能装饰器被认为是装饰器提案的可能扩展,但目前不是任何针对TypeScrip或Java脚本的提案的一部分。
当然,您可以在另一个函数上调用类似修饰符的函数,但这只是一个更高阶的函数,而不是修饰符本身,它不会影响原始函数声明:
makeErrorWrapper
函数接受错误处理程序并返回一个新函数,该函数用该错误处理程序 Package 其他函数:所以现在
errToUndefined
是一个函数 Package 器。假设我们有以下抛出错误的函数:如果直接调用,可能会得到运行时错误:
相反,您可以将其 Package 起来:
现在,
wrappedFoo
是一个新函数,其行为与foo
类似,并采用与foo
相同的参数列表,但返回number | undefined
,而不仅仅是number
:Playground链接到代码
3okqufwl2#
也许这能帮到你,我花了很长时间才做到这一点,但它在这里
在你的班上
使用父函数,您可以修改和添加以接收errorPersonalized和示例化的类型参数...在回执上写上它