闭包中的这种简单的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);
}
}
显然,以上重写破坏了该功能。我只是好奇在第一种情况下我做错了什么。
答案 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 => { ... }