網站搜尋

我如何從另一個 enum 在 Typescript 中組合一個 enum?


我有一個包含一些任意值的列舉(enum),並且想要自動將該列舉的值以一對一的方式映射到另一個列舉(加上一些任意的值)。完成這個任務最具慣用的方式是什麼?

我想做類似這樣的事情:以宣告式的方式將 Element.keys+"Magic" 添加到 Skills 枚舉中,然後可以將這些值作為鍵使用,而不需要重複工作並添加後綴。

enum Element {
  Air,
  Fire,
  Earth,
  Water
}

-->

enum Skills {
  // Unrelated Skills
  Unarmed,
  LightArmor,
  etc. . .

  // 1-to-1 Mapping
  AirMagic,
  FireMagic,
  EarthMagic,
  WaterMagic
}

答案#1

基本上,你是在要求將 enum 彼此組合和擴展,就像在編譯時使用簡單的集合操作來擴展和組合它們的內部成員一樣。

簡而言之:你不能。

由於列舉是在編譯時定義的,它們的成員集合是靜態的,不能從其他列舉中派生。你可以有計算出的成員,但那是針對它們所持有的值。

要讓你訪問 enum 並像問題中所要求的那樣操作,你需要對你的枚舉進行元編程,即對它們使用裝飾器。但在 Typescript 中目前無法做到這一點。

我的建議是使用 class 和/或 type。更多資訊請參考這個回答。

答案#2

為了以防其他人也想達成類似的事情,我來回答我自己的問題……


雖然似乎無法使用枚舉來完成這個任務,但我已經通過「模板字面量類型」達成了類似的效果。

type Element =
  | "Air"
  | "Fire"
  | "Earth"
  | "Water";
type Skills =
  | "Unarmed"
  | "LightArmor"
  | `${Element}Magic`;

這會產生一個字串聯集類型,如下所示:"Unarmed" | "LightArmor" | "AirMagic" | "FireMagic" | "EarthMagic" | "WaterMagic"


資源

https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html

https://www.typescriptlang.org/play?#code/C4TwDgpgBAogNhAthAdsAKuaBeKAiAQQEsAnPKAH3wDFSJyq8YBDE4ACwfwHVngIyAbgCwAKDGhIUAMoBrInDgBnKLjwBVFK2QATLngAyRAObtgBEogD2ZSlAAGAEgDe8JKgxYAvgFlmxogBjexFxUQAzAFcUQOAiKxQofiVgAAoleUUALhlM5QBKKGcxKChAhKUrBAA6OCtjdLz8sS8xMQB6dqhMKWYoFJIiFGModgFocJsoZkjgK3LEMAQ4hOqJCBTUwlI-AMC8ZrCgA