You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过TypeScript Compiler API检测箭头函数?

TypeScript AST遍历:无法识别箭头函数的问题

问题场景

尝试按照TypeScript Wiki的《Using the Type Checker》示例进行AST遍历,但无法识别箭头函数:

箭头函数代码:

/**
 * Hello
 */
export const hello = (): string => 'hello';

遍历代码中无法识别:

function visit(node: ts.Node) {
   console.log(node.kind, ts.isArrowFunction(node)); // -> 236, false
}

但普通函数声明可以被正常识别:

/**
 * Hello
 */
export function hello (): string {return 'hello'};

遍历代码识别正常:

function visit(node: ts.Node) {
   console.log(node.kind, ts.isFunctionDeclaration(node)); // -> 255, true
}

原因分析

箭头函数在这里并非独立的顶级节点,而是作为变量声明的初始化器存在于AST结构中。你当前访问的node是VariableStatement(变量声明语句)或VariableDeclaration(变量声明)类型,而非箭头函数本身。

而普通函数声明是直接的FunctionDeclaration节点,所以能直接通过ts.isFunctionDeclaration识别。

解决方案

修改遍历逻辑,先定位到变量声明节点,再检查其初始化器是否为箭头函数:

function visit(node: ts.Node) {
  // 处理变量声明语句
  if (ts.isVariableStatement(node)) {
    node.declarationList.declarations.forEach(declaration => {
      // 检查初始化器是否为箭头函数
      if (declaration.initializer && ts.isArrowFunction(declaration.initializer)) {
        console.log('识别到箭头函数:', declaration.initializer);
        console.log(declaration.initializer.kind, ts.isArrowFunction(declaration.initializer)); // -> 236, true
      }
    });
  }
  // 保留函数声明的处理逻辑
  else if (ts.isFunctionDeclaration(node)) {
    console.log('识别到函数声明:', node);
  }
}

补充说明

AST结构层级:
VariableStatement → VariableDeclarationList → VariableDeclaration → initializer(箭头函数节点)

你需要深入到变量声明的初始化器属性中,才能获取到箭头函数节点进行判断。


内容的提问来源于stack exchange,提问作者David Dal Busco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:48:14