网站搜索

typescript - TS-Morph,是否有可能操作块节点以添加语句?


我想在类中的异步箭头函数内动态添加语句;我阅读了文档,但没有找到任何可以帮助我的内容,我只能获取到我想要插入语句的块节点。有任何干净的方法可以实现吗?

  import {SyntaxKind, ArrowFunction, Block} from "ts-morph";
  //
  // .....
  // 
  let methodBody = `methodName = async(arg) => { }`;
  serviceClass.addMember(methodBody);
  let method = serviceClass.getMemberOrThrow('methodName');
  let arrowFunction =method.getDescendantsOfKind(SyntaxKind.ArrowFunction)[0];
  let block =arrowFunction.getDescendantsOfKind(SyntaxKind.Block)[0];
  ///
  /// block.addStatement('...') ???

答案#1

有一种名为“addStatements”的方法,正好符合你的需求。

方法 1:纯文本

你可以将语句作为纯文本添加:

block.addStatements(
    [
        "console.log('hello');",
        "",
        "console.log('world');"
    ]);

方法 2:编译器节点

如果你不在意代码是否按相应格式排版,你也可以使用 ts-morph 的 printNode 方法:

import { printNode, ts } from "ts-morph";

// [...]

block.addStatements(
    [
        printNode(ts.factory.createNewExpression(ts.factory.createIdentifier("Array"))
    ]);

方法 3:在另一个文件中准备的节点

或者,为了保持代码格式,你也可以在另一个文件中准备这些语句,然后再将其添加到代码块中。

let file = project.createSourceFile("temp.ts");
let varStatement = file.addVariableDeclaration(/* [...] */);

block.addStatements(
    [
        varStatement.getFullText()
    ]);