打字稿编译器API对我来说是新的,似乎我缺少了一些东西。
我正在寻找使用编译器API更新ts文件中特定对象的方法
现有文件-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
*/
}
};
毕竟,我想得到这样的东西:
export const someConstant = {
name: 'Jhon',
lastName: 'Doe',
additionalData: {
age: 999,
height: 3333,
someProp: 'NEW_Value'
eyeColor: 'brown',
email: '[email protected]',
otherProp: 'with some value'
}
};
谢谢,请放心在家:)
最佳答案
我开始写关于如何使用编译器API的答案,但后来我放弃了,因为它开始变得超级长。
通过执行以下操作,使用ts-morph可以轻松实现:
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 protected]"),
}, {
name: "otherProp",
initializer: writer => writer.quote("with some value"),
}]);
// output the new text
console.log(sourceFile.getFullText());
关于javascript - 使用Typescript编译器API读取和更新对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61213501/