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()
]);
