TypeScript编译器API:访问已解决的“此”参数类型

时间:2018-12-03 14:44:59

标签: typescript typescript-compiler-api

使用编译器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”解析为“ void”。使用调试器进行跟踪时,我可以看到签名有一个名为“ thisParameter”的成员,看来它具有我所需要的。但这不是通过接口公开公开的,所以我不能真的依赖它。有没有办法正确访问类型?

1 个答案:

答案 0 :(得分:0)

要从签名中获取此参数类型,似乎您将需要访问内部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