網站搜尋

實作「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,但這還遠不是完整的範例。

非常感謝!