gpt4 book ai didi

typescript - 使用 TypeScript Compiler API 在函数前添加注释

转载 作者:行者123 更新时间:2023-12-03 20:30:12 29 4
gpt4 key购买 nike

我有一个想要转换为 JavaScript 的 TypeScript 文件。作为翻译的一部分,我想在每个函数之前添加一个注释,我希望使用 TypeScript Compiler API 来做到这一点。
我尝试了两种不同的方法。其中之一是捕获 SourceFile并更改其statements , 像这样:

const program = ts.createProgram([args.input], {});
const srcFile = find(program.getSourceFiles(), (sourceFile) => !sourceFile.isDeclarationFile);
srcFile.statements = ts.createNodeArray(srcFile.statements.map((statement) => {
if (!ts.isFunctionDeclaration(statement)) {
return statement;
}
return ts.addSyntheticLeadingComment(
statement,
ts.SyntaxKind.MultiLineCommentTrivia,
"My long desired comment",
true,
);
}));
这给了我以下错误:
TypeError: Cannot read property 'emitNode' of undefined
at getOrCreateEmitNode (/Users/.../node_modules/typescript/lib/typescript.js:52792:19)
at getOrCreateEmitNode (/Users/.../node_modules/typescript/lib/typescript.js:52801:17)
at setSyntheticLeadingComments (/Users/.../node_modules/typescript/lib/typescript.js:52918:9)
at Object.addSyntheticLeadingComment (/Users/.../node_modules/typescript/lib/typescript.js:52923:16)
at /Users/.../dist/index.js:26:15
at Array.map (<anonymous>)
at Object.<anonymous> (/Users/.../dist/index.js:21:60)
at Module._compile (internal/modules/cjs/loader.js:654:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
at Module.load (internal/modules/cjs/loader.js:566:32)
我尝试打印 statement就在 ts.addSyntheticLeadingComment 之前和 statementFunctionDeclaration ,正如预期的那样,尽管缺少 emitNode字段,我希望由 getOrCreateEmitNode 创建功能。
我尝试的第二种方法类似,但遇到了同样的问题;而不是覆盖原来的 srcFile.statement ,我正在使用打印机,如下:
const printer = ts.createPrinter(undefined, {
substituteNode: (hint, node) => {
if (ts.isFunctionDeclaration(node)) {
return ts.addSyntheticLeadingComment(
node,
ts.SyntaxKind.MultiLineCommentTrivia,
"My long desired comment",
true,
);
}
},
});

console.log(printer.printFile(srcFile));
这给出了与前面的代码相同的错误。
我要更改的 TypeScript 文件非常简单:
function myFunc(a: number, b: number): number {
return a + b;
}

最佳答案

不需要替换节点。请记住,注释不是 AST 的一部分,因此不要将它们添加到语句数组中以代替现有函数声明。相反,只需调用 addSyntheticLeadingComment在节点上而不使用返回值。

例如,以下代码可以正常工作:

import * as ts from "typescript";

const file = ts.createSourceFile("test.ts", `function myFunc(a: number, b: number): number {
return a + b;
}`, ts.ScriptTarget.Latest, true);
const functionDec = file.statements.find(ts.isFunctionDeclaration)!;

ts.addSyntheticLeadingComment(functionDec, ts.SyntaxKind.MultiLineCommentTrivia,
"My long desired comment", true);

const printer = ts.createPrinter({ removeComments: false });
console.log(printer.printFile(file));

输出:
/*My long desired comment*/
function myFunc(a: number, b: number): number {
return a + b;
}

关于typescript - 使用 TypeScript Compiler API 在函数前添加注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008676/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com