使用编译器 API 进行类型推断

ben*_*inz 7 typescript typescript-compiler-api

我正在尝试使用 TypeScript 的编译器 API 来执行非常基本的类型推断,但我无法从文档或谷歌搜索中找到任何有用的信息。

本质上,我想要一个函数inferType,它接受一个变量并返回它的推断定义:

let bar = [1, 2, 3];
let bar2 = 5;

function foo(a: number[], b: number) {
  return a[0] + b;
}

inferType(bar); // => "number[]"
inferType(bar2); // => "number"
inferType(foo); // "(number[], number) => number"
Run Code Online (Sandbox Code Playgroud)

无论如何,我可以通过编译器 API 实现这一点吗?如果没有,无论如何我可以通过其他方式实现这一目标吗?

can*_*ero 5

您可以使用我的 TypeScript Compiler API Playground 示例 LanguageService 类型检查示例:https : //typescript-api-playground.glitch.me/#example=ts-type-checking-source

这也是 node.js 脚本,它解析输入的打字稿代码,并根据它的使用方式推断任何符号的类型。它使用 TypeScript Compiler API ,创建一个 Program,然后魔术就是“program.getTypeChecker().getTypeAtLocation(someNode)”

工作示例:https : //github.com/cancerberoSgx/typescript-plugins-of-mine/blob/master/typescript-ast-util/spec/inferTypeSpec.ts

如果您不熟悉 Compiler API,请从这里开始。此外,您还有几个项目可以让它变得更容易:

祝你好运


bas*_*rat 0

无论如何我可以通过编译器 API 实现这一点

代码是字符串时,编译器 API 可以让您检查代码。例如

const someObj = ts.someApi(`
// Code 
let bar = [1, 2, 3];
let bar2 = 5;

function foo(a: number[], b: number) {
  return a[0] + b;
}
`);
// use someObj to infer things about the code
Run Code Online (Sandbox Code Playgroud)

如果没有,我是否可以通过其他方式实现这一目标?

typeof尽管其用途受到很大限制

或者使用nodejs加载__filename代码(仅在节点中工作,并且仅在运行思想ts-node即原始TS时): https: //nodejs.org/api/globals.html#globals_filename