2017-06-05 75 views
0
// 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__}); 
} 

实际上在修改NodeArrays,我有两个问题:插入任意文本和打字稿编译器API

  1. 如何创建字符串AST片段?
  2. 如何添加导入?

P.S. I tried各种方法createSourceFilets.createImportDeclaration,但他们都带来这样或那样的错误:[

+1

您是否尝试过使用替换节点的适当文本创建标识符?换句话说:''createIdentifier('(function compiledTemplate(deps){/*...*/}')''。 –

+0

这是工作0_o ,但是如何在'@ scope/lib'中添加'import lib;'? – RubaXa

回答

1

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


要在import语句添加,请记住,您要更新树突变原。

ts.visitEachChild API需要nodesVisitor参数,该参数专门用于NodeArray s。通常,如果您未通过nodesVisitor,它将在NodeArray中的每个Node上使用您为visitor参数传递的第一个回调进行操作,但此处您特别要在整个节点阵列上进行操作。

在你的情况,你有兴趣在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); 
+0

唉,不要工作:https://gist.github.com/RubaXa/5896badb923f0805aa9fcdc480afe9cc#file-x-danielros enwasser-ts – RubaXa

+0

查看我给出的关于如何创建新节点以及如何调用'visitEachChild'的示例。 –

+0

发生了,但仍然无法正常工作:https://github.com/RubaXa/typescript-api-questions/tree/master/import-add – RubaXa