Как получить все имена интерфейсов из файла? (Машинопись)

Я хочу получить все имена интерфейсов из определенного файла.

например:

file1.ts

   private interface first{
...
}

private interface second{
...
}

private interface third{
...
}

file2.ts

const interfacesList = GetInterfacesFrom(filePath); //in this case filePath = file1.ts

Я хотел бы вернуться: ["first","second","third"];

ОБНОВИТЬ

Я хочу построить механизм типа EntityFramework в машинописи;

Но мне нужно знать, как автоматически сопоставлять имя интерфейсов / классов с путем API, чтобы узнать, есть ли у меня интерфейс или класс, который API для вызова...

2 ответа

Я получил имена интерфейсов в своем коде, используя API компилятора внутри подпроекта машинописного текста. машинописный текст версии 4.1.3

Вот моя функция обещания:

      const getInterfacesNamesFromFile = (filepath: string): Promise<string[]> => {
    return new Promise ((res, rej) => {
        // absolute path to interface file
        const absoluteFilepath = path.join(path.resolve(...basePath), filepath);
        const mainProgramFilepath = path.join(__dirname, '../', '../', 'src', 'main.ts');
        let program = ts.createProgram([mainProgramFilepath], {allowJs: true});
        const sourceFile = program.getSourceFile(absoluteFilepath);
        const interfaceNames: string[] = [];
        ts.forEachChild(sourceFile, node => {
            if (ts.isInterfaceDeclaration(node) {
                interfaceNames.push(node.name.text);
            }
        })
        res(interfaceNames);
    });
}

РЕДАКТИРОВАТЬ

Вышеупомянутая функция не охватывала импорт типов из других файлов, что означает, что любой интерфейсный файл, импортированный откуда-то, завершился неудачно.

Чтобы заставить их работать, вы можете настроить параметры createProgram в соответствии с вашим проектом. Вот несколько советов (проект NodeJS):

      import path from 'path';
import dir from 'node-dir';
import * as ts from 'typescript';

// compiler options has enums, so check definitions inside
const tsconfig: ts.CompilerOptions = {
  moduleResolution: 2, // "node"
  module: 1, // CommonJS
  esModuleInterop: true,
  target: 2, // ES6, says ES2015, should be same
  baseUrl: "../src", // .. if you have typescript subproject
  ...
}
// get source files in array, same as tsconfig includes: ['src/**/*']
const rootNames = await new Promise((res, rej) => {
  dir.files(path.resolve('src'), (err, files) => {
    err ? rej() : res(files);
  });
});

let program = ts.createProgram(rootNames, tsconfig);

Затем измените указанную выше функцию, чтобы использовать созданную программу с конфигурациями.

Вам нужно использовать API компилятора

API позволяет анализировать исходный код и получать символы из него.

Другие вопросы по тегам