【问题标题】:Typescript transformer, `node.parent` is undefined打字稿转换器,`node.parent`未定义
【发布时间】:2021-03-13 02:11:13
【问题描述】:

我目前正在使用 typescript 转换器 api,我发现 node.parent 未定义。

我的代码是:

        const transformerFactory: ts.TransformerFactory<ts.Node> = (
            context: ts.TransformationContext
        ) => {
            return (rootNode) => {
                function visit(node: ts.Node): ts.Node {
                    node = ts.visitEachChild(node, visit, context);

                    // HERE node.parent IS UNDEFINED !

                    return filterFn(node, context);


                }
        
                return ts.visitNode(rootNode, visit);
            };
        };
        
        const transformationResult = ts.transform(
            sourceFile, [transformerFactory]
        );

如何找到节点的父节点?

【问题讨论】:

  • 根节点没有父节点。
  • 我没有为每个其他节点获取父节点

标签: typescript-compiler-api


【解决方案1】:

您可以解析指定设置父节点:

const sourceFile = ts.createSourceFile(
    "fileName.ts",
    "class Test {}",
    ts.ScriptTarget.Latest,
    /* setParentNodes */ true, // specify this as true
);

或者在节点上做一些操作让它设置它的父节点(例如类型检查程序...IIRC在绑定期间它确保父节点被设置)。

根据评论更新

如果您是从程序中创建这些,那么您可以执行以下操作:

const options: ts.CompilerOptions = { allowJs: true };
const compilerHost = ts.createCompilerHost(options, /* setParentNodes */ true);
const program = ts.createProgram([this.filePath], options, compilerHost);

【讨论】:

  • 如果我有this.program = ts.createProgram([this.filePath], { allowJs: true }); this.sourceFile = this.program.getSourceFile(this.filePath); ,这可能吗?
  • @nexis 没问题!
猜你喜欢
  • 2016-11-06
  • 2021-08-11
  • 2016-09-05
  • 2016-12-13
  • 2020-02-12
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多