首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript编译器:如何从CallExpression中获取原始函数的FunctionDeclaration?

TypeScript编译器:如何从CallExpression中获取原始函数的FunctionDeclaration?
EN

Stack Overflow用户
提问于 2019-05-09 04:10:06
回答 1查看 228关注 0票数 4

我刚刚开始研究TypeScript的内部机制,我对如何获得原始函数的SignatureFunctionDeclaration感到困惑,因为它引用了原始函数在任意CallExpression中的用法。

考虑下面的例子:

代码语言:javascript
复制
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> { ... },我不确定如何实现它。

如果能帮上忙,我会很感激,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-09 05:44:00

您需要获取类型的符号,然后才能获取该符号的声明:

代码语言:javascript
复制
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>();
// }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56048340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档