我刚刚开始研究TypeScript的内部机制,我对如何获得原始函数的Signature或FunctionDeclaration感到困惑,因为它引用了原始函数在任意CallExpression中的用法。
考虑下面的例子:
class A<T> {
...
}
function f<T>(): A<T> {
return new A<T>();
}
function test(): void {
const foo = f;
foo<number>();
}给定对foo<number>() CallExpression的引用,我可以很容易地用typechecker.getTypeAtLocation(node)推断出它的物化类型以及返回值的类型。但是,我实际上想要做的是获得原始函数的类型,即function f<T>(): A<T> { ... },我不确定如何实现它。
如果能帮上忙,我会很感激,谢谢!
发布于 2019-05-09 05:44:00
您需要获取类型的符号,然后才能获取该符号的声明:
import * as ts from 'typescript'
let p = ts.createProgram({
rootNames: ["test.ts"],
options: {
}
})
const t = p.getTypeChecker();
var source = p.getSourceFile("test.ts");
const decl = source.statements[2] as ts.FunctionDeclaration; // function test(): void {....}
const fnCallStatement = decl.body.statements[1] as ts.ExpressionStatement; // foo<number>();
const fnCall = fnCallStatement.expression as ts.CallExpression; // foo<number>()
const fnTarget = fnCall.expression; // foo
let type = t.getTypeAtLocation(fnTarget) // <T>() => A<T>
let symbol = type.getSymbol() // symbol: f
let fnDecl = symbol.getDeclarations()[0]
console.log(fnDecl.getFullText());
// output:
// function f<T>(): A<T> {
// return new A<T>();
// }https://stackoverflow.com/questions/56048340
复制相似问题