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

How can I use the TS compiler API to see if types in a .d.ts have changed?

我希望能够判断自上次编译以来 TypeScript 声明文件中的类型是否发生了变化。一些误报是可以的(说类型已经改变而实际上没有改变)但是当某些东西改变时说什么都没有改变是不正确的。

对于没有导入的 .d.ts,我可以在旧的 .dts 和新的 .d.ts.

之间进行字符串比较

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

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

在那种情况下,我可以递归并序列化 Wrapped,然后比较序列化的表示。但是对于递归类型,事情变得相当复杂。

对于标称类型,我想我必须关联 NodeId 或其他东西。

TS 编译器 API 中是否有某些东西已经做到了这一点或解决问题的替代方法?

我相信最有效的方法是只使用 AST。因此,您可以使用 ts.createSourceFile 解析 AST,使用 ts.forEachChild 遍历节点,创建您自己的符号 table-like 结构,而不是基于文本的差异旧的和新的声明文件,然后比较结构的差异。根据实施的程度,它可能会导致一些误报,您必须让它了解如何遵循导入和导出声明模块说明符到其他文件。

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

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