Как получить все имена интерфейсов из файла? (Машинопись)
Я хочу получить все имена интерфейсов из определенного файла.
например:
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 компилятора
- официальные документы https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API
API позволяет анализировать исходный код и получать символы из него.