Как я могу использовать API-интерфейс компилятора TypeScript, чтобы найти, где определено объявление окружающего модуля? - PullRequest
2 голосов
/ 01 апреля 2020

Если что-то определено в объявлении окружающего модуля в другом файле:

declare module "@foo" {
    export default function func(): number;
}

и использовать модуль:

import func from "@foo";

Как я могу использовать API компилятора TS, чтобы выяснить, где func определено?

Обычно, чтобы выяснить, откуда происходит импорт, я использую ts.resolveModuleName, но в этом случае он всегда возвращает undefined.

1 Ответ

1 голос
/ 01 апреля 2020

Это возможно, если следовать за символами объявления.

  1. Получить узел идентификатора func.
  2. Получить его символ, который будет локальным для текущего файла.
  3. Получить псевдоним символа этого символа, который будет символом объявления.
  4. Получить объявление этого псевдонима символа, который будет объявлением функции.

Вот отдельный пример:

// setup
import { createProjectSync, ts } from "@ts-morph/bootstrap";

const project = createProjectSync();
project.createSourceFile("foo.d.ts", `declare module "@foo" { export default function func(): number; }`);
const sourceFile = project.createSourceFile("file.ts", `import func from "@foo";`);
const typeChecker = project.createProgram().getTypeChecker();

// get the "func" identifier in the import declaration
const importDec = sourceFile.statements[0] as ts.ImportDeclaration;
const funcIdent = importDec.importClause!.name!;

// follow the symbols to the function declaration
const funcImportSymbol = typeChecker.getSymbolAtLocation(funcIdent)!;
const funcDecSymbol = typeChecker.getAliasedSymbol(funcImportSymbol);
const funcDec = funcDecSymbol.getDeclarations()![0];

console.log(funcDec.getText());

Кроме того, для получения исходного файла, на который есть ссылка в спецификаторе модуля, я все же рекомендую получить символ спецификатора модуля вместо использования ts.resolveModuleName, как указано в этого ответа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...