Я пытаюсь реализовать в 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
: { ссылка }, но это далеко из полного примера.
Большое спасибо!