typescript - 如何从引用其他类型别名的类型别名中提取类型参数和类型参数?

标签 typescript tsc typescript-compiler-api

如何使用 TypeScript 编译器 API 4.2+(或 ts-morph 10+)从以下内容中提取:

export type A = Record<string,number>
  • 导出类型别名 A 的事实
  • 是对 Record
  • 的引用
  • 并传递 string & number
  • 并且 Record 也是一个类型别名
  • 带有两个类型参数,
  • 获取每个人的姓名/约束/默认值。
  • 最佳答案

    由于 TS 4.2 中的行为发生了变化,到目前为止我能想到的最好的事情是遍历 AST 并检查类型别名的类型节点。不过可能有更好的方法...
    在 ts-morph 中:

    const aTypeAlias = sourceFile.getTypeAliasOrThrow("A");
    const typeNode = aTypeAlias.getTypeNodeOrThrow();
    
    if (Node.isTypeReferenceNode(typeNode)) {
      // or do typeNode.getType().getTargetType()
      const targetType = typeNode.getTypeName().getType();
      console.log(targetType.getText()); // Record<K, T>
    
      for (const typeArg of typeNode.getTypeArguments()) {
        console.log(typeArg.getText()); // string both times
      }
    }
    
    使用编译器 API:
    const typeAliasDecl = sourceFile.statements[0] as ts.TypeAliasDeclaration;
    const typeRef = typeAliasDecl.type as ts.TypeReferenceNode;
    
    console.log(checker.typeToString(checker.getTypeAtLocation(typeRef.typeName))); // Record<K, T>
    
    for (const typeArg of typeRef.typeArguments ?? []) {
      console.log(checker.typeToString(checker.getTypeAtLocation(typeArg))); // string
    }
    

    关于typescript - 如何从引用其他类型别名的类型别名中提取类型参数和类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66389805/

    相关文章:

    javascript - 如何在输入中初始化用户可编辑的数据?

    javascript - Ionic 2 中的本地存储无法访问 then() 方法之外的数据

    javascript - Angular 2 |无法分配给数组,因为它是常量或只读属性

    javascript - 刷新 URL 中包含 ID 的页面时找不到bundle.js

    angular - System.register-Issue 设置 Angular Quickstart

    typescript - 如何使用 typescript Compiler API 获取正常的函数信息,例如 : returnType/parameters?

    javascript - 有没有办法在 react 组件的表格上添加边框?

    typescript - 如何键入检查内存中的 TypeScript 代码片段?

    typescript - 从 TypeScript 编译器 API 获取推断类型参数

    node.js - @Types/Sequelize 错误 TS1086 : An accessor cannot be declared in ambient context