在打字稿编译器API中插入任意文本并修改nodearrays


// Input
class Foo {
    templateString = 'some value';
}
// Output
import __LIB__ from '@scope/lib/path/to/lib';
class Foo {
    templateString = (function compiledTemplate(deps) {
        // ...
        return result;
    })({lib: __LIB__});
}

实际上,我有两个问题:

  1. 如何从字符串中创建AST-FRAGMENT?
  2. 如何添加导入?

P.S。我尝试了各种方法createSourceFilets.createImportDeclaration,但是它们都导致了这个错误:[

要添加任意文本,我知道的最好方法是将createIdentifier与要插入的字符串一起使用。


要添加导入语句,请记住,您正在更新树而无需突变原始。

ts.visitEachChild API采用nodesVisitor参数,该参数专门在NodeArray s上运行。通常,如果您不通过nodesVisitor进入,则使用visitor参数传递的第一个回调,它将在NodeArray中的每个Node上操作,但是在这里您特别想在完整的节点阵列上操作。

在您的情况下,您对SourceFile的语句感兴趣(这是NodeArray<Statement>。您可以使用createImportDeclaration创建导入,并通过在nodesVisitor中传递SourceFile,如下:

function addImport(statements: ts.NodeArray<ts.Statement>) {
    const importStatement = ts.createImportStatement(/*...*/);
    return ts.createNodeArray([importStatement, ...statements]);
}
visitEachChild(
    sourceFile,
    /*replace this with something that controls traversal*/ x => x,
    context, 
    addImport);

最新更新