如何通过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
相关产品推荐
相关产品推荐

