众所周知,Typescript现在是完全开源的。可在Tyescript获取。我正在构建一个应用程序,它将获得Typescript代码作为输入,并为输出提供给定代码的AST。为我提供一个正确的方法来提取输入Typescript代码的AST(抽象语法树),而不是压缩它并将其转换为Javascript。
答案 0 :(得分:4)
基本代码:
const fileNames = ["C:\\MyFile.ts"];
const compilerOptions: ts.CompilerOptions = {
// compiler options go here if any...
// look at ts.CompilerOptions to see what's available
};
const program = ts.createProgram(fileNames, compilerOptions);
const typeChecker = program.getTypeChecker();
const sourceFiles = program.getSourceFiles();
sourceFiles.filter(f => /MyFile\.ts$/.test(f.fileName)).forEach(sourceFile => {
ts.forEachChild(sourceFile, node => {
const declaration = node as ts.Declaration;
if (declaration.name) {
console.log(declaration.name.getText());
}
});
});
因此,如果您提供C:\MyFile.ts
之类的话:
class MyClass {}
interface MyInterface {}
它会输出MyClass
和MyInterface
。
找出超出我刚刚展示的所有内容是很多工作。您可能更有利于查看和/或帮助this work in progress。
答案 1 :(得分:0)
TypeScript编译器不支持它,但是您可以使用recast和babylon @ next来实现。尽管您将不得不信任这些技术定义的用于表示TypeScript代码AST的语法,并且它们将保持最新状态-因为TypeScript具有逐个版本发布(短时间)的新语言功能-与其他语言(JavaScript)不同),您具有定义明确的版本并以标准发布-因此,如果您的用户开始使用新的语言功能,则这些技术(主要是巴比伦)应该保持最新状态:
// npm install recast babylon@next
const source = `
interface I {
color: string
}
class C implements I{
color: string='blue'
}
`
const recast = require('recast')
const tsParser = require("recast/parsers/typescript")
const ast = recast.parse(source, {
parser: tsParser
});
console.log(`
CODE:
${source}
AST:
${JSON.stringify(ast)}
`);