在闭包内尝试/捕获给出错误

时间:2018-06-25 12:28:05

标签: typescript

闭包中的这种简单的try / catch在使用TypeScript进行编译时出现错误:

type TryCatchFn = (args: any, context: any) => void;

function try_catch(fn: TryCatchFn): TryCatchFn {
    return (args, context) => void {
        try {
            throw new Error('Something bad happened');
        } catch (e) {
            console.log(e);
        }
    }
}

输出为:

data/src/cloud_scripts.ts:12:7 - error TS1005: ':' expected.

12      try {
            ~


data/src/cloud_scripts.ts:13:10 - error TS1005: ':' expected.

13              throw new Error('Something bad happened');
                      ~~~


data/src/cloud_scripts.ts:13:45 - error TS1005: ',' expected.

13              throw new Error('Something bad happened');
                                                         ~


data/src/cloud_scripts.ts:14:5 - error TS1005: ',' expected.

14      } catch (e) {
          ~~~~~

但是,如果我将其重写为不调用fn函数,则不会出现错误:

type TryCatchFn = (args: any, context: any) => void;

function try_catch(fn: TryCatchFn): void {
    try {
        throw new Error('Something bad happened');
    } catch (e) {
        console.log(e);
    }
}

显然,以上重写破坏了该功能。我只是好奇在第一种情况下我做错了什么。

2 个答案:

答案 0 :(得分:2)

箭头函数返回类型的类型注释必须在参数列表之后和=>之前:

type TryCatchFn = (args: any, context: any) => void;

function try_catch(fn: TryCatchFn): TryCatchFn {
    return (args, context): void => {
        try {
            throw new Error('Something bad happened');
        } catch (e) {
            console.log(e);
        }
    }
}

或者您可以完全省略返回类型:

function try_catch(fn: TryCatchFn): TryCatchFn {
    return (args, context) => {
        try {
            throw new Error('Something bad happened');
        } catch (e) {
            console.log(e);
        }
    }
}

答案 1 :(得分:1)

写时:

return (args, context) => void { ... }

这被解释为带有表达式主体的箭头函数。 void运算符计算以下表达式,然后将结果丢弃,因此,此函数返回undefined。在这种情况下,表达式是对象文字,而try在对象文字中无效。

没有void

return (args, context) => { ... }

将是带有block语句主体的箭头函数。您的try在这里可以正常工作。如果您没有从代码块中返回任何内容,则无需显式指定返回类型,但是您可以:

return (args, context): void => { ... }