3
// 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 片段?
  2. 如何添加导入?

PS我尝试了各种方法createSourceFilets.createImportDeclaration但它们都导致了这个或那个错误:[

4

1 回答 1

4

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


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

ts.visitEachChildAPI 接受一个nodesVisitor专门对 s 进行操作的参数NodeArray。通常,如果你不传入nodesVisitor,它会NodeNodeArray使用你为参数传递的第一个回调中对每个进行操作visitor,但这里你特别想对全节点数组进行操作。

在您的情况下,您对 aSourceFile的语句(即 a )感兴趣NodeArray<Statement>。您可以使用创建导入,并通过传入 a 来createImportDeclaration更新,如下所示:SourceFilenodesVisitor

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);
于 2017-06-05T08:11:56.853 回答