API-интерфейс компилятора TypeScript: доступ к разрешенному типу параметра this - PullRequest
0 голосов
/ 03 декабря 2018

Используя API компилятора, мне нужно получить доступ к реальному типу явного параметра 'this' из ts.Signature.

// 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 голосов
/ 03 декабря 2018

Чтобы получить этот тип параметра из подписи, вам нужно получить доступ к внутреннему свойству thisParameter.Например:

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

В качестве альтернативы, можно получить его непосредственно из типа.В этом случае ts.Type является ts.TypeReference, поэтому:

const type = checker.getTypeAtLocation(node.type!) as ts.TypeReference;
const typeArg = type.typeArguments![0];
console.log(typeArg); // void
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...