如何使用TS编译器API查看.d.ts中的类型是否已更改?

时间:2019-11-30 13:04:14

标签: typescript typescript-compiler-api

我想知道自上次编译以来TypeScript声明文件中的类型是否已更改。某些误报是可以的(说类型没有改变就可以改变),但是不能肯定地说什么也没有改变。

对于没有导入的.d.ts,我可以在旧.dts和新.d.ts之间进行字符串比较。

但是,.d.ts具有导入时,其含义可能取决于其他文件中的内容:

import { OtherType } from "./other"
export type Wrapped = { other: OtherType }

在那种情况下,我可以遍历并序列化Wrapped,然后比较序列化的表示形式。但是递归类型使事情变得非常复杂。

对于名义类型,我认为我必须将NodeId或其他东西关联起来。

TS编译器API中是否已经有此功能或解决问题的替代方法?

1 个答案:

答案 0 :(得分:1)

我认为,最有效的方法是仅与AST一起使用。因此,您可以执行“语义差异”,而不是基于文本的差异,而在其中使用ts.createSourceFile解析AST,使用ts.forEachChild遍历节点,从而创建自己的符号表状结构的新旧声明文件,然后比较结构差异。根据实现的程度,它可能会导致一些误报,并且您必须使它理解如何将导入和导出声明模块说明符遵循到其他文件。

另一种方法是使用类型检查器并获取两个源文件(const fileSymbol = typeChecker.getSymbolAtLocation(sourceFile);)的符号。从那里,您可以比较exports属性中的键,然后向下浏览这些值到声明(例如,参见this answer)。

无论如何,这是一个相当高的答案。让我知道您是否希望我进一步详细介绍任何内容。您正在做的是一个等待创建的工具(例如,检查声明文件是否有重大更改)。