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

TypeScript Compiler API中ts.TransformerFactory替换节点报错问题

问题根因

你触发报错的核心原因有两个:

  1. 未限制类型就调用getText():你对所有CallExpression的expression都调用getText()方法,但IIFE场景下外层的调用表达式function() {}()的expression是函数表达式,不是标识符,此时调用getText()本身就不符合预期
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:27:02