javascript - Læs og opdater objekt med Typescript compiler API
TypeScript-kompilatorens API er ny for mig, og det ser ud til, at jeg mangler noget. Jeg leder efter en måde at opdatere et specifikt objekt i en ts-fil med kompilator-API'en
Eksisterende fil - some-constant.ts
export const someConstant = {
name: 'Jhon',
lastName: 'Doe',
additionalData: {
age: 44,
height: 145,
someProp: 'OLD_Value'
/**
* Some comments that describes what's going on here
*/
}
};
Trods alt vil jeg gerne få noget som dette:
export const someConstant = {
name: 'Jhon',
lastName: 'Doe',
additionalData: {
age: 999,
height: 3333,
someProp: 'NEW_Value'
eyeColor: 'brown',
email: '[email ',
otherProp: 'with some value'
}
};
Svar #1
Jeg begyndte at skrive et svar på, hvordan man gør dette med compiler-API'en, men så gav jeg op, fordi det begyndte at blive super langt.
Dette er let muligt med ts-morph ved at gøre følgende:
import { Project, PropertyAssignment, QuoteKind, Node } from "ts-morph";
// setup
const project = new Project({
useInMemoryFileSystem: true, // this example doesn't use the real file system
manipulationSettings: {
quoteKind: QuoteKind.Single,
},
});
const sourceFile = project.createSourceFile("/file.ts", `export const someConstant = {
name: 'Jhon',
lastName: 'Doe',
additionalData: {
age: 44,
height: 145,
someProp: 'OLD_Value'
/**
* Some comments that describes what's going on here
*/
}
};`);
// get the object literal
const additionalDataProp = sourceFile
.getVariableDeclarationOrThrow("someConstant")
.getInitializerIfKindOrThrow(ts.SyntaxKind.ObjectLiteralExpression)
.getPropertyOrThrow("additionalData") as PropertyAssignment;
const additionalDataObjLit = additionalDataProp
.getInitializerIfKindOrThrow(ts.SyntaxKind.ObjectLiteralExpression);
// remove all the "comment nodes" if you want to... you may want to do something more specific
additionalDataObjLit.getPropertiesWithComments()
.filter(Node.isCommentNode)
.forEach(c => c.remove());
// add the new properties
additionalDataObjLit.addPropertyAssignments([{
name: "eyeColor",
initializer: writer => writer.quote("brown"),
}, {
name: "email",
initializer: writer => writer.quote("[email "),
}, {
name: "otherProp",
initializer: writer => writer.quote("with some value"),
}]);
// output the new text
console.log(sourceFile.getFullText());
