typescript - TS-Morph, Este posibil să manipulezi un nod de tip block pentru a adăuga declarații?


Vreau să adaug dinamic instrucțiuni într-o funcție săgeată async dintr-o clasă; am citit documentația și nu am găsit nimic care să mă ajute, am reușit doar să obțin nodul bloc în care vreau să introduc instrucțiunile mele. Există vreo modalitate curată de a face acest lucru?

  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('...') ???

Răspuns #1

Există o metodă numită "addStatements" care se potrivește exact nevoilor tale.

Metoda 1: Text simplu

Ai putea să adaugi declarații ca text simplu:

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

Metoda 2: Noduri-Compilator

Dacă nu vă pasă să aveți codul formatat corespunzător, ați putea folosi de asemenea metoda printNode din ts-morph:

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

// [...]

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

Metoda 3: Noduri pregătite într-un alt fișier

Ei bine, pentru a păstra codul formatat, ai putea de asemenea să pregătești declarațiile într-un alt fișier și să le adaugi ulterior în bloc.

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

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