Реализация "макросов" преобразователя TypeScript - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь реализовать в TypeScript следующий преобразователь "макросов". Я хотел бы расширить определение, например:

class SourceClass {
    @lazy
    lazyProperty    : Map<number, string>       = new Map()
}

до:

class SourceClass {
    $lazyProperty   : Map<number, string>       = undefined

    get lazyProperty () : Map<number, string> {
        if (this.$lazyProperty !== undefined) return this.$lazyProperty

        return this.$lazyProperty = new Map()
    }

    set lazyProperty (value : Map<number, string>) {
        this.$lazyProperty = value
    }
}

И я хочу, чтобы свойство $lazyProperty было доступно для остальной части программы ( чтобы иметь возможность проверить наличие ленивого значения). Так, например, я бы хотел, чтобы этот код правильно проверял тип, даже если $lazyProperty сгенерирован в «макросах»:

class SourceClass {
    @lazy
    lazyProperty    : Map<number, string>       = new Map()

    method () {
        if (this.$lazyProperty !== undefined) { ... }
    }
}

Для этого мне нужно, чтобы преобразование произошло до этап проверки типов в конвейере компилятора, который, как я выяснил после некоторых исследований, не работает с обычными преобразователями.

Однако, если я прав, существуют различные обходные пути, наиболее расширенный - ts-morph, но я ищу что-то, что совместимо с ts-patch и предпочтительно что-то, что хорошо интегрируется с языковыми службами IDE.

Может ли кто-нибудь, имеющий опыт работы с подобными преобразователями, изложить план реализации ? Может, где-то есть рабочий пример? (он должен быть, преобразование макросов должно быть довольно распространенным требованием).

Пока что я обнаружил что-то, связанное с переопределением CompilerHost: { ссылка }, но это далеко из полного примера.

Большое спасибо!

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