[英]Typescript String Based Enums
所以我已閱讀了Typescript中基於字符串的枚舉的所有帖子,但我找不到符合我要求的解決方案。 那些將是:
到目前為止我在打字稿中看到的可能性是:
enum MyEnum {bla, blub}
:這是基於字符串的失敗,所以我不能簡單地讀取基於字符串的JSON ... type MyEnum = 'bla' | 'blub'
type MyEnum = 'bla' | 'blub'
:不可迭代且無代碼完成 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"}}
:指定元素兩次 所以這里有問題:
enums
字符串為基礎? 為什么他們沒有根據枚舉字符串
要清楚枚舉是數字和字符串 ,因為直接訪問是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
因為屬性的有效值只是foo
和bar
。
我想這就是為什么有些語言有基於字符串的Enums
:)
如果查看已編譯的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.