實作「macros」TypeScript 轉換器
我正在嘗試在 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 有關的資料:https://stackoverflow.com/a/59147818/365104,但這還遠不是完整的範例。
非常感謝!