在Try Catch中 Package 函数定义的TS修饰符

fxnxkyjh  于 2022-10-12  发布在  Node.js
关注(0)|答案(2)|浏览(178)

可以使用TS修饰器将函数定义 Package 到try-Catch块中吗?我不想在每个函数中都使用Try-Catch,所以我在想也许装饰者可以提供帮助。例如

function examleFn(errorWrapper: any) {
  try{
    // some code
  } catch (err) {
  errorWrapper(err)
  }
}

这样的事情可以在装饰器中完成,这样它也可以用于其他功能。

bttbmeg0

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 其他函数:

const errToUndefined = makeErrorWrapper(err => undefined);

所以现在errToUndefined是一个函数 Package 器。假设我们有以下抛出错误的函数:

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

console.log(wrappedFoo("abc")) // 3
console.log(wrappedFoo("abcde")) // undefined

Playground链接到代码

3okqufwl

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和示例化的类型参数...在回执上写上它

相关问题