API компилятора Typescript: создание полного дендрария свойств идентификатора типа - PullRequest
0 голосов
/ 16 февраля 2020

Учитывая идентификатор типа, я ищу способ для генерации полного выцветания объекта типа AST. Например, если у меня есть:

File1.ts

type Content = {
    title: string,
    image: string,
    dims: number[]
}

File2.ts

type BlogPost = Pick<Content, 'title'|'image'>

type User {
    name: string,
    email: string,
    news: BlogPost[]
}

File3.ts

const test: User = { ... };

Мой код должен быть в состоянии вывести из идентификатора пользователя такой список:

name
email
news.title
news.image

Я экспериментировал с несколькими вещами: используя checker.getTypeAtLocation, перебирая каждое свойство по одному, найдите правильный символ и попытайтесь определить имена свойств.

Но я думаю (надеюсь), что этот метод слишком сложен для выполнения sh таких простых вещей, потому что мне приходится обрабатывать, помимо типов объектов, каждую возможность типов для свойств: Picks, Exclude, Array , Omit, KeyOf, ...

Все, что я хочу, это список свойств окончательной полной формы типа.

Поэтому мой вопрос:

Предоставляет ли API компилятора Typescript инструменты, помогающие мне в моих поисках? Например, для типа, подобного этому:

type Content = { title: string, id: number }
type Hello = Pick< Content, 'id' >

Создайте окончательный и полный AST, например, так:

type Hello = {
    id: number
}

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 19 февраля 2020

Все, что мне нужно, это список свойств окончательной завершенной формы типа.

Вот полный пример, который показывает, как это сделать:

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

const project = new Project();
const file = project.createSourceFile("./main.ts",
    `type Content = { title: string, id: number }; type Hello = Pick< Content, 'id' >`);
const typeChecker = project.createProgram().getTypeChecker();

// get type alias
const helloTypeAliasDec = file.statements.find(s => ts.isTypeAliasDeclaration(s)
    && s.name.getText(file) === "Hello")!;

// get the type alias' type
const type = typeChecker.getTypeAtLocation(helloTypeAliasDec);

// now loop over all its properties
for (const property of type.getProperties()) {
    const propertyType = typeChecker.getTypeOfSymbolAtLocation(property, helloTypeAliasDec);
    console.log("Name:", property.name, "Type:", typeChecker.typeToString(propertyType));
}

Выходы: Name: id Type: number

На основании этой информации вы сможете построить AST, но есть несколько крайних случаев, с которыми вы можете столкнуться.

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