Существует ли API для создания отражения c TypeScript? - PullRequest
0 голосов
/ 04 февраля 2020

Я бы хотел извлечь метаданные, связанные с Props объектами. В приведенном ниже примере я мог бы получить что-то простое:

{
  suffix: 'string',
  count: 'number',
  increment: 'function'
}

Я понимаю, что это сложная задача, поскольку каждый из этих объектов может быть, например, объединяющим типом. Но я хотел бы получить отправную точку, и я могу жить, не захватывая всю информацию о типе в этом отражении.

Ручной подход заключается в использовании синтаксического анализатора для получения AST этого объекта Props, но это требует серьезной работы, потому что любой из этих типов может ссылаться на типы из других файлов, поэтому мне придется написать сценарий, который по сути знает, как следить за импортом и, возможно, другими сложностями, о которых я пока не задумывался.

Прежде чем приступить к такой сложной задаче, мне было интересно, есть ли уже какой-нибудь API для этого, официальный ли TypeScript, созданный и используемый каким-либо другим популярным инструментом. Плагины редактора кода должны каким-то образом получать эту информацию для автозаполнения.

enter image description here

Пока я нашел этот проект: https://github.com/plumier/tinspector - Но, похоже, он не очень используется и, похоже, не следует за импортом, что является моей главной заботой.

Спасибо!

1 Ответ

1 голос
/ 04 февраля 2020

Вы можете использовать компилятор TypeScript (который доступен в виде пакета NPM) для статического анализа исходного кода TypeScript.

import * as ts from 'typescript';
import * as fs from 'fs';

/** Root of AST for complete program/file */
const ast = ts.createSourceFile(
  'source-file.ts',
  fs.readFileSync(`${process.cwd()}/src/source-file.ts`).toString(),
  ts.ScriptTarget.ES2018,
  true
);

Для вашего конкретного сценария c вам нужно будет поискать в API-интерфейс компилятора TypeScript, но в целом вы пересекаете AST и проверяете различные типы узлов, которые вы хотели бы обрабатывать в своем приложении, например интерфейсы.

switch (node.kind) {
  case ts.SyntaxKind.InterfaceDeclaration:
    // Process interface declaration node by going deeper in another function
    break;
  // And so on...
}

Как вы сказали, в зависимости от то, что вы хотите сделать, может быть более или менее сложным. Но с API компилятора довольно легко работать с NodeJS -backend.

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