How do you get inferred type from a typescript AST? How do you get inferred type from a typescript AST? typescript typescript

How do you get inferred type from a typescript AST?


The compiler knows about that type---bar.foo() doesn't compile---how can I programmatically get the type?

The AST is not the complete story for TypeChecking. You need a TypeChecker.

The simplest solution is to create a program (some docs https://basarat.gitbooks.io/typescript/content/docs/compiler/program.html) and then use program.getTypeChecker (more docs https://basarat.gitbooks.io/typescript/content/docs/compiler/checker.html) 🌹


As far as I can tell this does the trick:

// load typechecker for fileconst program = ts.createProgram([filename], {});const typeChecker = program.getTypeChecker()// now get astconst 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);

The only weird part is that in a variable declaration, the "node" must be the value (aka FirstLiteralToken) and not the label (aka Identifier)---otherwise, the type is undefined.For example, if the file contents are const foo = 123, passing the node for "foo" to typeChecker#getTypeAtLocation won't work. You must pass the node for "123"