簡體   English   中英

打字稿基於字符串的枚舉

[英]Typescript String Based Enums

所以我已閱讀了Typescript中基於字符串的枚舉的所有帖子,但我找不到符合我要求的解決方案。 那些將是:

  • 提供代碼完成的枚舉
  • 可以迭代的枚舉
  • 不必兩次指定元素
  • 基於字符串

到目前為止我在打字稿中看到的可能性是:

  1. enum MyEnum {bla, blub} :這是基於字符串的失敗,所以我不能簡單地讀取基於字符串的JSON ...
  2. type MyEnum = 'bla' | 'blub' type MyEnum = 'bla' | 'blub' :不可迭代且無代碼完成
  3. 自己動手做class MyEnum { static get bla():string{return "bla"} ; static get blub():string{return "blub"}} class MyEnum { static get bla():string{return "bla"} ; static get blub():string{return "blub"}} :指定元素兩次

所以這里有問題:

  1. 有沒有辦法同時滿足這些要求? 如果不是,將來是否可能?
  2. 他們為什么不以enums字符串為基礎?
  3. 有人遇到類似的問題,你是如何解決的?

為什么他們沒有根據枚舉字符串

要清楚枚舉是數字字符串 ,因為直接訪問是number ,反向映射是string更多內容 )。

滿足您的要求

排除原始枚舉的關鍵原因是

所以我不能簡單地從基於字符串的JSON中讀取...

您將體驗相同的事情,例如,在閱讀Date因為JSON沒有日期數據類型。 您可以使用new Date("someServerDateTime")來轉換它們。

您將使用相同的策略從服務器端enum (字符串)到TS enum (數字)。 由於反向查找MyEnum["someServerString"]輕松完成

水化

將服務器端數據轉換為客戶端活動數據的過程有時稱為水合。 我目前最喜歡的lib是https://github.com/pleerock/class-transformer

我親自在服務器訪問級別處理這些內容,即手寫一個使XHR +進行序列化的API。

在我上一份工作中,我們通過代碼生成實現了自動化,甚至更多(支持服務器和客戶端代碼之間的常見驗證模式)。

我認為,實現Enum與數字的C-般的風格是好的,因為Enum (類似於Symbol )通常用來聲明值是唯一可識別的開發時間。 機器如何在運行時表示該值並不真正與開發人員有關。

但是我們開發人員有時想要的東西(因為我們都很懶,但仍希望獲得所有好處!),就是使用Enum作為API或使用不與我們共享Enum的API,即使API是本質上是一個Enum因為屬性的有效值只是foobar

我想這就是為什么有些語言有基於字符串的Enums :)

TypeScript如何處理枚舉

如果查看已編譯的JavaScript,您可以看到TypeScript只使用普通的JavaScript對象來實現Enum 例如:

enum Color {
    Red,
    Green,
    Blue
}

將被翻譯成:

{
  0: "Red",
  1: "Green",
  2: "Blue",
  Blue: 2,
  Green: 1,
  Red: 0
}

這意味着您可以像Color[Color.Red]一樣訪問字符串值。 您仍然可以完成代碼,而不必兩次指定值。 但是你不能只用Object.keys(Color)迭代Enum ,因為值在對象上存在“兩次”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM