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

标签 typescript typescript-compiler-api

我有以下类型和函数签名

type Ctor<T> = {
  new (): T
}

export function foo<T>(Ctor: Ctor<T>) {

}

class Bar { foo = 'what' }

foo(Bar) // inferred type of T is Bar

我尝试使用编译器 API 在调用站点 foo(Bar) 获取 T 的推断类型。到目前为止我已经尝试过,

if (ts.isCallExpression(node)) { 
  const funcType = typeChecker.getTypeAtLocation(node.expression)
}

但这只能获取 foo 的声明类型。它没有在调用站点传递给它的类型参数。我也尝试过,

if (ts.isCallExpression(node)) { 
  const args = node.typeArguments
}

但这也是空的,我认为因为类型没有显式传递。

那么如何在每个调用站点获取 T 的推断类型?

最佳答案

您可以从解析的签名中获取此信息:

if (ts.isCallExpression(node)) {
  const signature = checker.getResolvedSignature(node);
  if (signature != null) {
    // outputs -- (Ctor: Ctor<Bar>): void
    console.log(checker.signatureToString(signature));
    const params = signature.getParameters();
    for (const param of params) {
      const type = checker.getTypeOfSymbolAtLocation(param, node);
      // outputs -- Ctor<Bar>
      console.log(checker.typeToString(type));
    }
  }
}

关于typescript - 从 TypeScript 编译器 API 获取推断类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73772639/

相关文章:

javascript - 通过 stardustjs 放大使用 WebGL 的 D3 可视化

typescript - 如何从 TypeScript Compiler API 中的 TypeReferenceType 获取声明的类型?

typescript - 如何合并两个 Typescript AST

typescript - 应该如何使用 TypeScript 编译器 API 的 'module resolution cache'?

javascript - express 中req和res的类型?

typescript - 使用 TypeScript 通用接口(interface)

javascript - 在 typescript 中连接两个对象

typescript - 使用 TypeScript Compiler API 在函数前添加注释

typescript - 使用typescript编译器API获取接口(interface)字段类型信息

typescript - Typescript 中函数声明的可重用类型注释?