Given the Typescript declaration:
export const map = new Map([
[1, 'one'],
[2, 'two'],
]);
, I would like to get the inferred type, ie: Map<number, string>, using only the native compiler API (Version 5.0.4).
This is the AST in AST-viewer
It correctly identifies the type of the <NewExpression>, but digging in their code shows that they are using a non-native library, "ts-morph".
My logic has been so far:
const checker ... //<ts.TypeChecker>
const fileNode ... //<ts.SourceFile>
const fileSymbol = checker.getSymbolAtLocation(fileNode)! //returns <ts.Symbol>
const fileType = checker.getTypeOfSymbol(fileSymbol)! //returns <ts.Type>
const mapSymbol = fileType.getProperty('map')! //returns <ts.Symbol>
console.log(mapSymbol.getName()) //"map"
checker.getTypeOfSymbol(mapSymbol) //returns a <ts.Type>.intrinsicName: 'error'
I was expecting to get a valid <ts.Type> from the symbol.
I have tried extracting the type from all the ancestors, but have had no success.
I have also tried <ts.NewExpression>.typeArguments, but this is undefined. The closest I have got is <ts.NewExpression>.arguments, but I want to avoid parsing them with a 3rd party or custom type extractor.
I suspect my inexperience with the compiler API is causing me to miss something obvious, but again, maybe not. A steer in the right direction would be much appreciated.
Check the result of
ts.getPreEmitDiagnostics(program). Sounds like there's an error.The following works for me:
It uses the TypeScript compiler directly. It doesn't use ts-morph on the website at all.