TypeScript 编译器 API:如何创建一个在发出文件时替换节点的转换器

TypeScript Compiler API: how to create a transformer that's replace a node when emit files

我正在尝试使用 TypeScript Compiler API 编写一个 Typescript Transformer,它为每个节点标识符附加一个后缀,到目前为止我有以下代码:

main.ts

import * as ts from "typescript";

const transformerFactory: ts.TransformerFactory<ts.Node> = context => rootNode => {
    function visit(node: ts.Node): ts.Node {
        node = ts.visitEachChild(node, visit, context);
        if (ts.isIdentifier(node))
            return context.factory.createIdentifier(node.text + "suffix");
            
        return node;
    }
    return ts.visitNode(rootNode, visit);
};

const program = ts.createProgram(["source.ts"], {})

// PRINTER
const sourceFile = program.getSourceFile("source.ts")
const transformationResult = ts.transform(sourceFile, [transformerFactory])
const transformedSourceFile = transformationResult.transformed[0];
const printer = ts.createPrinter();
const result = printer.printNode(
    ts.EmitHint.Unspecified, 
    transformedSourceFile, 
    undefined
);
console.log(result)

// EMIT
program.emit();

作为输入文件,我编写了一个名为 source.ts 的文件,内容如下:

source.ts

const test_____: number = 1 + 2;

它可以很好地打印到控制台,但在发出文件时什么也不做,请看下面的结果:

console.log

const test_____suffix: number = 1 + 2;

source.js

const test_____ = 1 + 2;

如何使发出的文件与控制台上打印的文件相同?

在该代码中进行的转换和打印在发出过程之外。您需要将转换器工厂提供给 emit 方法,而不是使用转换和打印机 API:

const program = ts.createProgram(["source.ts"], {});

program.emit(undefined, undefined, undefined, undefined, {
  before: [transformerFactory]
});