首页 > 解决方案 > TypeScript 编译器:TypeChecker#getTypeAtLocation() 为非本地类型返回错误

问题描述

我正在开发一些 TypeScript 工具。为此,我TypeChecker#getTypeAtLocation()用来确定PropertyDeclaration只有 ainitializer但没有声明的 a 的类型type。这适用于原语(数字、字符串等)和本地声明的类型。但是,对于导入的类型,我总是会得到一个错误类型。这在一定程度上是有道理的,因为导入的类型不是当前语法树的一部分,但在许多情况下它也没有帮助。可能是什么问题,请记住我tsc.js使用 Nashorn 在 JVM 中运行?

标签: typescript-compiler-api

解决方案


TypeChecker实例只能与在创建类型检查器的相应实例中找到的源文件和后代节点一起使用Program

您看到的错误类型是因为源文件尚未经历为其创建符号的绑定阶段。只有ts.SourceFile当类型检查器通过程序的CompilerHost.

调用 时TypeChecker#getTypeAtLocation,它可能会在内部尝试获取该节点的符号。当它这样做时,它不会找到符号然后返回错误类型。在提供字符串和数字文字时调用此方法有效,因为在这种情况下编译器不需要查看符号来确定类型。

要解决此问题,请从Program实例获取源文件(例如,通过使用program.getSourceFiles()or program.getSourceFile(fileName))而不是直接结果ts.createSourceFile(仅将其提供给编译器主机)。


推荐阅读