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]
});
我正在尝试使用 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]
});