我有以下类型和函数签名
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/