TypeScript编译器API、检查器、getTypeCatalog?是否有一个声明的类型表可从“为什么不”的检查器中获得?

TypeScript编译器API、检查器、getTypeCatalog?是否有一个声明的类型表可从“为什么不”的检查器中获得?,typescript,typescript-compiler-api,Typescript,Typescript Compiler Api,像这样初始化typescript编译器API之后 const program = ts.createProgram(fileNames, options); const checker = program.getTypeChecker(); 该程序现在已经编译,这意味着typescript程序已经完成了整个程序一次,并且有机会构建一个types表 在github上提供的typescript调试版本中,checker上有一个函数 ts.getTypeChecker().getTypeCata

像这样初始化typescript编译器API之后

 const program = ts.createProgram(fileNames, options);
 const checker = program.getTypeChecker();
该程序现在已经编译,这意味着typescript程序已经完成了整个程序一次,并且有机会构建一个types表

在github上提供的typescript调试版本中,checker上有一个函数

ts.getTypeChecker().getTypeCatalog()
但在发行版上它不可用

引自,仅在概念层面进行了描述,没有示例:

符号:命名声明。符号是绑定的结果。符号将树中的声明节点连接到构成同一实体的其他声明。符号是语义系统的基本组成部分。 类型:类型是语义系统的另一部分。类型可以命名(例如类和接口)或匿名(例如对象类型)

TypeChecker要做的第一件事是将来自不同源文件的所有符号合并到一个视图中,并通过“合并”任何公共符号(例如跨多个文件的名称空间)来构建一个符号表

初始化原始状态后,TypeChecker准备回答有关程序的任何问题。这些“问题”可能是:

此节点的符号是什么? 这个符号的类型是什么? 在AST的这一部分中可以看到哪些符号? 函数声明的可用签名是什么? 文件应报告哪些错误

打字检查器懒散地计算一切;它只“解析”回答问题所需的信息。检查器将只检查与当前问题有关的节点/符号/类型,而不会尝试检查其他实体

所以我要回答我自己的问题:是和否

是的,因为“TypeChecker将…将来自不同源文件的所有符号合并到一个视图中”

否,因为“TypeChecker懒散地计算所有内容;它只“解析”回答问题所需的信息。”

ts.getTypeChecker()
上有几十个函数可用-它们没有文档记录,而且在解析“deep”类型的情况下没有使用示例


我已经成功地使用了
ts.getTypeChecker.forEachChild(…)
来遍历文件,例如定位函数声明。但是,对于手头的类型,我不知道如何使用检查器解析类型并创建一个向下到基本体的层次结构。

查找此信息的最佳位置是通过

getTypeCatalog
函数是内部函数,不是公共API()的一部分:

不过,我不确定访问它是否有用

我已成功地使用ts.getTypeChecker.forEach(…)遍历文件,例如查找函数声明。但对于手头的类型,我不知道如何使用检查器解析类型并创建一个层次结构,直到基本体

我不认为
forEach
函数存在于
TypeChecker
上(也许你指的是符号上的
forEach


为此,可以获取源文件AST(
program.getSourceFiles()
),使用
sourceFile.forEachChild(child=>{/*递归调用child.forEachChild*/})
遍历它们,然后可以使用
typeChecker.getTypeAtLocation(child)
获取类型。

这在文档中有吗?@Daniel_Knights-我已经扩展了这个问题以回应您的评论。我仍然找不到任何关于
getTypeCatalog
的参考。它确实说,“请记住,这还不是一个稳定的API…”。我已经将
forEach
更改为
forEachChild
。显然,如果不使用
forEachChild
,我就不会迭代树
getTypeAtLocation
返回标识符的类型,该类型不回答我的问题。“读取代码”-是的,但这是默认设置。@CraigHicks
forEachChild
可在
节点或导出的
ts
模块(不在TypeChecker上)上使用。对不起,有些人可能会遍历符号,而不是AST,所以它不是那么明显。。。特别是在讨论forEach的
时,这是一种符号方法。换句话说,我的答案是,我不相信通过公共API可以获得这些信息。可能遍历声明并使用
getTypeAtLocation
是最佳选择(或者根据您的情况使用
getSymbolAtLocation
getSymbolInscope
)。使用
Type#getBaseTypes
Type#getProperties()
可能有用。getSymbolsInScope正在产生有用的结果。
interface TypeChecker {
  // ...omitted...

  /* @internal */ getTypeCatalog(): readonly Type[];

  // ...omitted...
}