如何在打字稿中提取函数的类型?

时间:2016-04-04 20:53:41

标签: typescript

说我有这个文件foo.ts

export const render = function ( a : Image, b : number ) : Image {
  // ...
}

如何提取"渲染"的类型? ?

我想最终得到这样的JSON:

{ "render": { "params": [ "Image", "number" ], "return": "Image" } }

用例:我正在构建一个工具,用户可以在视觉上连接打字稿代码的元素,我想缓存"插槽的类型"这样我就可以预先看到哪些连接是可能的。

2 个答案:

答案 0 :(得分:1)

打字稿中没有办法做到这一点(我知道)。

您运行的是javascript而不是打字稿,并且所有类型在编译的javascript代码中都不可用。

如果你有代码作为打字稿,你可以使用typescript编译器来构建一个语法树,然后从中得到你想要的。
您可以使用节点执行此操作,可能使用typescript模块本身,但它可能不容易也没有很好地记录,这个打字稿编译器项目(npm | github)但不是&#39看起来像是在维护。

但是,如果您只想在客户端中执行此操作,那么您可能会遇到问题 一个简短的搜索突然显示typescript-scripttypescript-compile,但我还没有真正了解这些操作以及操作方式,因此我不确定它们是否可以满足您的需求。

修改

以下是另一个想法,如果您要求用户提供.d.ts文件以及.ts文件,您可能会省去很多麻烦。
从那里你可以获得所需的信息,你必须开始搜索和比较文件,但这是一种不同的麻烦。

答案 1 :(得分:1)

  

我正在构建一个工具,用户可以在视觉上连接打字稿代码的元素,我想缓存"插槽的类型"这样我就可以预先看到哪些连接是可能的。

您需要暂停typecheckerwhat is it)。

作为示例,您可以使用npm typescript模块导出的方法获取显示部件

https://github.com/TypeStrong/atom-typescript/blob/ae66fbbba503aaa2329209421f3362a35f89127c/lib/main/lang/fixmyts/quickFixes/extractVariable.ts#L179-L180

let type = typeChecker.getTypeAtLocation(node);
let typeSignature = ts.displayPartsToString(ts.typeToDisplayParts(typeChecker, type)).replace(/\s+/g, ' ');

那就是说我正在编写一个可以帮助像你这样的其他工具开发人员的工具:http://alm.tools/