是否存在ESLint规则禁止try块仅单行代码时使用try-catch写法?
结论
目前ESLint核心规则、@typescript-eslint官方规则集没有提供开箱即用、完全匹配该约束的现成规则,可通过no-restricted-syntax自定义AST选择器实现该校验,你之前的配置未生效是因为选择器编写错误。
原有配置问题
你之前使用的选择器TryStatement > BlockStatement[body.length=0],匹配的是**try代码块内容为空(0条语句)**的场景,和你需要匹配「try块仅包含1条语句」的目标完全不符,因此不会触发校验。
可用配置
基础版:匹配所有try块仅1行且带catch的场景
"no-restricted-syntax": [ "error", { "selector": "TryStatement[handler!=null] > BlockStatement[body.length=1]", "message": "try块内仅包含1行代码时禁止使用try/catch,请改用Promise链式.catch()写法处理错误" } ]
精准版:仅匹配try块为单行await的场景(推荐)
同步代码无法使用Promise的.catch()捕获错误,因此可以收窄校验范围,仅对单行await的try/catch场景报错,避免误报正常的同步代码try/catch:
"no-restricted-syntax": [ "error", { "selector": "TryStatement[handler!=null] > BlockStatement[body.length=1] > :first-child:is(ExpressionStatement[expression.type='AwaitExpression'])", "message": "单行await禁止使用try/catch包裹,请改用`await xxx().catch(err => { /* 错误处理 */ })`的链式写法" } ]
如果你使用的ESLint版本较低不支持
:is()伪类选择器,可以升级ESLint到8.x以上版本,或拆分选择器为多条规则配置。
内容的提问来源于stack exchange,提问作者Maor agai
相关产品推荐
相关产品推荐

