網站搜尋

typescript - 在 ESNext 之前,如何獲取類中未初始化的靜態屬性名稱?


我有一個 TypeScript 類,其中幾個靜態屬性保持 未初始化,例如:

class A {
    static foo:number
    static bar:number
}

for(const key in A) {
    console.log(key)
}

如果我在目標 ESNext 中編譯這段代碼,一切都正常,所有鍵都會被紀錄。

然而,如果我將目標改為任何先前的版本,即使是 ES2020,我也會得到空的輸出。

當我深入查看生成的 JavaScript 代碼時,我可以看到所有屬性都已被移除:

"use strict";
class A {
}
for (const key in A) {
    console.log(key);
}

我該如何在 ESNext 之前保留這些屬性?

答案#1

我相信對你的問題的答案很可能是「不」。

Typescript 可以使用 useDefineForClassFields,我認為在這種情況下對 esnext 來說目前是正確的(來源:https://github.com/microsoft/TypeScript/issues/43113)。

但是 es2021 仍然沒有靜態欄位。來源:https://github.com/tc39/proposal-class-fields —— 根據該提案頁面,它們處於第 3 階段(至少是這樣說的)。

重現您的問題:https://www.typescriptlang.org/play?module=5&ts=4.3.4#code/MYGwhgzhAECC0G8BQ1XQgFzBglsaAZgPZEBcAdgK4C2ARgKYBOA3CmptntLWIxTQxZIAvkiTAi5CERD0AdCCIBzABQByAA6MiGImoA00APK0AVvWAY5S+hiMB3cgAVtGphgCeAEXoRgjHA1dRggVWDktHR0PNwBKWLFiRhUJKQxoAGt6D2gccjhYxDZUVOlZBWUVLI8E4SA

請注意,你可以使用 static #foo 接近達成目標,而使用 static ##foo 在某種程度上更接近……但這兩者都無法在目標環境中執行("目前不支持私有欄位")。這只是濫用對類別欄位和私有欄位漸進/部分支援的手段。

答案#2

只需將靜態屬性賦值為某個初始值

class A {
    static foo:number = 1
    static bar:number = 2
}

ES2015 上的 PlaygroundLink