TypeScript Compiler API中ts.TransformerFactory替换节点报错问题
问题根因
你触发报错的核心原因有两个:
- 未限制类型就调用
getText():你对所有CallExpression的expression都调用getText()方法,但IIFE场景下外层的调用表达式function() {}()的expression是函数表达式,不是标识符,此时调用getText()本身就不符合预期 - 修改AST后调用
getText()不可靠:你的遍历逻辑是先递归修改子节点,再处理当前节点,修改后的节点没有关联原始源文件的位置信息,此时调用getText()会因为缺少上下文直接抛出空指针错误
修复方案
完全不需要调用getText(),直接通过类型判断加内置属性判断就能实现需求,替换你的transformerFactory代码即可:
const transformerFactory: ts.TransformerFactory<ts.SourceFile> = context => { return node => { const visitor: ts.Visitor = rootNode => { if (ts.isCallExpression(rootNode)) { // 仅当调用表达式的被调用方是标识符,且名称为placeholder时才替换 if (ts.isIdentifier(rootNode.expression) && rootNode.expression.text === "placeholder") { return ts.factory.createIdentifier("__REPLACED__") } } return ts.visitEachChild(rootNode, visitor, context) } return ts.visitNode(node, visitor) } }
验证
修改后无论是普通函数还是IIFE场景都能正常转换,不会触发报错,转换结果符合预期。
内容的提问来源于stack exchange,提问作者Daniel de Andrade Varela
相关产品推荐
相关产品推荐

