gpt4 book ai didi

typescript - 根据实现解析泛型

转载 作者:行者123 更新时间:2023-12-05 04:28:46 24 4
gpt4 key购买 nike

我目前正在尝试构建一个工具,我需要为我的最终输出解析泛型类型。

请注意,我正在使用 ts-morph 库。

例如,给定以下来源和 classAClassDeclaration 作为爬行类型的“入口点”:

type X<T> = { fieldInType: T };
interface Y<T> {
fieldInInterface: T;
}

class classB<T> {
fieldInB?: T;
myFunction(a: T): void { //do something here }
}

class classA extends ClassB<string> {
interfaceField?: Y<string>;
typeField?: X<string>;
}

我想要这样的输出:

types of classA:
- interface Y { fieldInInterface: string } (from interfaceField)
- type X = { fieldInType: string } (from typeField)
- string (from fieldInB in parentClass)
- myFunction(a: string): void (from myFunction in parentClass)

我不确定如何正确处理这个问题。目前,我正在递归地爬取所有类型,从基类开始(我使用 get class.getBaseClass() 也递归地爬取基类,我希望这是正确/最简单的方法)。

对于泛型类型,我执行以下操作:

  1. 等到在抓取过程中遇到通用类型(例如在类上,或类内的类型别名)时检查它是否有类型参数。
  2. 如果是这样,通过跳转到类型定义(例如使用 getBaseClass() 或接口(interface)/别名类型使用 getSymbol()< 获取相应的类型参数getAliasSymbol())
  3. 遍历所有类型参数并获取相应的类型参数。
  4. 检查类型参数本身是否在映射中有一个条目(在下一点解释)。如果是这样,请将类型参数替换为已解析的类型。 (这是递归需要的定义泛型)
  5. 为每一对保存一个映射,即第 i 个类型参数的符号到类型参数中的类型

抱歉,我没有为此发布完整的代码示例,但我还没有完整的实现。

我的问题:

  1. 这是执行此操作的正确方法吗?或者是否有一些神奇的 typescript-compiler/ts-morph我忽略的功能正是实现了这一点?
  2. 我看到有一个 typeChecker.getTypeOfSymbolAtLocation(..),但我不确定如何准确使用它,以及它是否对我的用例有帮助。

最佳答案

是的,我想您会发现 getTypeAtLocationgetTypeOfSymbolAtLocation 很有用。

ts-ast-viewer.com 查看您的示例,然后在开发控制台中运行:

{
const classANode = sourceFile.statements[3];
const classAType = checker.getTypeAtLocation(classANode);
for (const prop of classAType.getProperties()) {
const type = checker.getTypeOfSymbolAtLocation(prop, classANode);
console.log(prop.escapedName, checker.typeToString(type));
}
}

关于typescript - 根据实现解析泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72529908/

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