【问题标题】:generating Typescript type string during runtime在运行时生成 Typescript 类型字符串
【发布时间】:2022-01-26 12:33:13
【问题描述】:

我想在运行时内省一个函数并生成一个类似于 VS Code 中悬停功能的 ReturnType 字符串。我知道 VS Code 只是在后台运行一个打字稿服务器,所以理论上这应该是可能的。

import * as ts from "typescript"

我已经能够导入 typescript 并抓取 AST 以获取函数声明的确切节点(尽管我希望这对箭头和常规函数都有效)。

示例

const foo = () => ({ bar: "baz" }); // function.ts
getReturnType("function.ts","foo") // returns "{bar:string}"

许多值得注意的警告之一是该函数可能会调用在不同文件中声明的其他函数,理想情况下,类型字符串应该将所有内容解析为原语,即,

type complex = {
  users: User[]
}

// what I want
type primitive = {
  users: { name: string; role: string }[]
}

VS 代码示例

【问题讨论】:

  • 即使 vscode 也无法将其解析为原语。不过,这个扩展做了类似的事情:github.com/d-kimuson/ts-type-expand 你可以查看它的源代码。但正如目前所说,这个问题对于 stackoverflow 来说非常广泛。

标签: typescript code-generation abstract-syntax-tree


【解决方案1】:

编辑:抱歉,我错过了最重要的细节,即您希望输出实际上是表示类型的字符串。您可以忽略其他答案。

你见过template literal strings吗?我并没有真正与他们合作过,但我看到了this similar 的问题并做了一些small adjustments(游乐场)以使其在当前的 TypeScript 中正常工作。

这对您想要实现的目标有意义吗?我在这里可能太简单了,但是如果我正确理解了您的问题,您甚至不需要实际操作 typescript 的 AST

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2017-03-10
    • 2016-08-31
    相关资源
    最近更新 更多