【问题标题】:Generating type declaration from import url using the TypeScript compiler API使用 TypeScript 编译器 API 从导入 url 生成类型声明
【发布时间】:2021-05-27 23:21:02
【问题描述】:

我正在尝试为项目生成一些类型声明。 这里的主要思想是,我已经到了能够生成类似这样的东西的地步:

type T = typeof import("somepath").default

default 是一个函数。

执行此操作的代码是:

ts.createTypeAliasDeclaration(
  undefined,
  undefined,
  ts.createIdentifier("T"),
  undefined,
  ts.createTypeOf(
    ts.createPropertyAccess(
      ts.createCall(
        ts.createToken(ts.SyntaxKind.ImportKeyword),
        undefined,
        [ts.createStringLiteral("somepath")]
      ), 
      ts.createIdentifier("default"))
    ),
    undefined,
    true
);

将其打印到控制台后,我可以看到它的输出确实是:

type T = typeof import("somepath").default

现在我有一个变量,比如t,它包含该类型别名声明的节点,但是当我尝试使用类型检查器提取类型时,我不断得到any。 到目前为止,我已经尝试过checker.getTypeAtLocationchecker.getTypeFromTypeNode,但无论我尝试什么,我都会不断收到any(我手动检查,vscode 确实可以验证类型不是any)。

任何帮助将不胜感激, 谢谢!

【问题讨论】:

    标签: typescript typescript-compiler-api


    【解决方案1】:

    TypeScript 编译器被设计为在转换之前进行类型检查,因此在大多数情况下,类型检查器假定其类型检查的节点将包含在源文件节点中,并且源文件的文本将匹配后代 AST 节点(将文本解析为源文件时,会在节点上设置一些内部数据。

    您可以通过将节点打印为文本(使用ts.createPrinter)、在源文件中重新解析它(ts.createSourceFile... 或使用update 方法更新现有源文件)来完成这项工作,得到对解析的T 类型别名节点的引用,然后在新程序中使用该源文件来获取新的类型检查器。代码太多了,放在这里太费劲了。

    【讨论】:

    • 我明白了,我希望避免创建另一个源文件并重新解析,但似乎没有其他办法。谢谢!
    • 嘿,大卫,也可以看看这个问题吗? stackoverflow.com/questions/68056834/…
    猜你喜欢
    • 2016-03-12
    • 2018-11-04
    • 2017-12-19
    • 2021-12-31
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2020-08-07
    相关资源
    最近更新 更多