首页 > 解决方案 > TypeScript API:如何检查调用表达式是否使用来自特定接口的签名?

问题描述

我使用 TypeScript 编译器 API 来应用一些转换。

假设我有一些my-pkg导出一些接口的包IExample

interface IExample {
  method1(): void;
}  

现在假设我有一个实现IExample

import {IExample} from "my-pkg";
declare const foo: IExample;
foo.method1();

如何检查foo.method1()表达式是否相关IExample.method1

显然我可以使用signature = TypeChecker.getResolvedSignature(node);
但是我怎样才能去'base'签名并检查它来自IExample哪里my-pkg

我尝试使用signature.declaration并获取它的父级(类声明或接口声明),但感觉是一种错误的方法,因为在这种情况下,我需要遍历所有父级扩展/实现子句来验证父级在IExample某处继承。

标签: typescripttypescript-compiler-api

解决方案


如果你得到调用表达式的表达式 ( foo.method1) 的符号,它应该是method1(): voidin的符号IExample

const symbol = typeChecker.getSymbolAtLocation(callExpr.expression);

// should output `method1`
console.log(symbol!.escapedName);

// should output `method1(): void`
console.log(symbol!.declarations[0].getText());

您将需要处理符号上可能symbol存在undefined并且可能存在多个声明(例如,通过声明合并合并的多个同名接口)。


推荐阅读