TypeScript Compiler API:访问“this”参数的解析类型

Posted

技术标签:

【中文标题】TypeScript Compiler API:访问“this”参数的解析类型【英文标题】:TypeScript Compiler API: Accessing resolved type of 'this' parameter 【发布时间】:2019-05-04 21:14:52 【问题描述】:

使用编译器 API,我需要从 ts.Signature 访问显式“this”参数的真实类型。

// Code being compiled
interface Fn1 
    (this: Foo): void;

const fn1: Fn1 = () => ;

interface Fn2<T> 
    (this: T): void;

const fn2: Fn2<void> = () => ;
// Compiler API
function visitVariableDeclaration(node: ts.VariableDeclaration, checker: ts.TypeChecker) 
    const type = checker.getTypeAtLocation(node.type);
    const signatures = checker.getSignaturesOfType(type, ts.SignatureKind.Call);
    const signature = signatures[0];
    // How do I access type of 'this' on signature?

目前,我可以调用 getDeclaration() 并查看适用于 Fn1 的参数。但对于 Fn2,它不会将“T”解析为“无效”。使用调试器进行跟踪时,我可以看到签名有一个名为“thisParameter”的成员,它似乎有我需要的东西。但这并没有通过界面公开公开,所以我不能真正依赖它。有没有办法正确访问类型?

【问题讨论】:

【参考方案1】:

要从签名中获取 this 参数类型,您似乎需要访问内部 thisParameter 属性。例如:

const thisParameter = (signature as any).thisParameter as ts.Symbol | undefined;
const thisType = checker.getTypeOfSymbolAtLocation(thisParameter!, node.type!);
console.log(thisType); // void

或者,可以直接从类型中获取它。在这种情况下,ts.Typets.TypeReference 所以:

const type = checker.getTypeAtLocation(node.type!) as ts.TypeReference;
const typeArg = type.typeArguments![0];
console.log(typeArg); // void

【讨论】:

谢谢!但是此解决方案假定声明将始终使用我的示例界面。我需要一个适用于任何签名的通用解决方案。 @tomb 更新以显示从签名中获取它。 thisParameter 属性未公开,但看起来您需要访问它。 这就是我害怕的——感谢您的确认

以上是关于TypeScript Compiler API:访问“this”参数的解析类型的主要内容,如果未能解决你的问题,请参考以下文章

[TypeScript] Installing TypeScript and Running the TypeScript Compiler (tsc)

浅析TypeScript Compiler 原理

Typescript Compiler - 捆绑外部库

如何在 TypeScript 中使用 Relay Modern(babel-plugin-relay 和 relay-compiler)?

Typescript 扩展通用接口

JAVA COMPILER API - 无法找到外部类文件