gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:56:54 24 4
gpt4 key购买 nike

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

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

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

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

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

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

TS 编译器 API 中是否有已经这样做的东西或解决问题的替代方法?

最佳答案

我相信最有效的方法是只使用 AST。因此,您可以使用“语义差异”代替基于文本的差异,在其中使用 ts.createSourceFile 解析 AST , 使用 ts.forEachChild 遍历节点为新旧声明文件创建自己的类似符号表的结构,然后比较结构的差异。根据实现的程度,它可能会导致一些误报,您必须使其了解如何将导入和导出声明模块说明符跟踪到其他文件。

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

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

关于typescript - 如何使用 TS 编译器 API 查看 .d.ts 中的类型是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com