Babel插件里怎么准确判断一个节点是不是箭头函数?

公孙馨翼 阅读 58

我最近在写一个Babel插件,想专门处理箭头函数,但发现用 path.isArrowFunctionExpression() 有时候不生效。比如遇到这种写法:const fn = () => {},明明是箭头函数,但判断结果却是 false,是我用错方法了吗?

我试过打印 path.node.type,显示的是 "ArrowFunctionExpression",但 path.isArrowFunctionExpression() 却返回 false,这有点让我摸不着头脑。

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
南宫美玲
兄弟,你这个问题的关键在于 path 指向的节点可能不是箭头函数本身。

你看 const fn = () => {} 这个结构,整个节点是 VariableDeclarator,它的 init 属性才是 ArrowFunctionExpression。你打印的 node.type 可能是父节点的 type,但 isArrowFunctionExpression() 是在当前 path 上判断的。

简单说,你拿到的是 VariableDeclarator 的 path,不是箭头函数的 path。

解决办法很简单,用 path.get('init').isArrowFunctionExpression() 先取到 init 属性再判断。

或者更直接:path.get('init').node.type === 'ArrowFunctionExpression'

还有个常见坑是如果 init 为 null(比如没赋值),直接调用会报错。先判断存不存在:const init = path.get('init'); if (init.node && init.isArrowFunctionExpression()) { ... }

另外提醒一下,箭头函数还有可能出现在函数参数默认值、对象属性等场景下,判断逻辑都差不多,先拿到对应的子节点再判断就行。
点赞
2026-03-16 14:48