Это возможно, если следовать за символами объявления.
- Получить узел идентификатора
func
. - Получить его символ, который будет локальным для текущего файла.
- Получить псевдоним символа этого символа, который будет символом объявления.
- Получить объявление этого псевдонима символа, который будет объявлением функции.
Вот отдельный пример:
// 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
, как указано в этого ответа .