你如何从打字稿AST获得推断类型?

时间:2016-01-12 05:19:04

标签: typescript abstract-syntax-tree typescript1.6 typescript1.7

我使用内置解析器从源代码生成AST:

const ts = require('typescript')
//...
const ast = ts.createSourceFile(filename, fs.readFileSync(filename).toString(), ts.ScriptTarget.ES6, true)

有没有办法从AST中获取变量的推断类型?例如,在下面的代码中,bar的类型为IBar。编译器知道那种类型--- bar.foo()没有编译 - 我怎样才能以编程方式获取类型?

interface IBar { bar() } 
const foo : IBar = //...
export const bar = foo

2 个答案:

答案 0 :(得分:4)

  

编译器知道那个类型--- bar.foo()没有编译---如何以编程方式获取类型?

AST不是TypeChecking的完整故事。你需要一个TypeChecker

最简单的解决方案是创建一个程序(一些文档https://basarat.gitbooks.io/typescript/content/docs/compiler/program.html),然后使用program.getTypeChecker(更多文档https://basarat.gitbooks.io/typescript/content/docs/compiler/checker.html

答案 1 :(得分:1)

据我所知,这就是诀窍:

// load typechecker for file
const program = ts.createProgram([filename], {});
const typeChecker = program.getTypeChecker()
// now get ast
const ast = ts.createSourceFile(filename, filecontents, ts.ScriptTarget.ES6, true))
// get node under question using ts.forEachChild (not shown here)
const node = // ...

const type = typeChecker.getTypeAtLocation(node);

唯一奇怪的部分是在变量声明中,“node”必须是value(又名FirstLiteralToken)而不是label(aka Identifier)---否则,类型是未定义。 例如,如果文件内容为const foo = 123,则将“foo”节点传递给typeChecker#getTypeAtLocation将不起作用。您必须传递节点“123”