2017-01-24 71 views
3

ES6符號非常適合枚舉,因爲它們避免了碰撞。我thouhgt是TS對枚舉如果target:'es6'enum型中使用的符號,但它並不:爲什麼不使用符號作爲枚舉

enum Role {Employee, Manager, Admin} 
let role: Role = Role.Employee; 

transpiles到

var Role; 
(function (Role) { 
    Role[Role["Employee"] = 0] = "Employee"; 
    Role[Role["Manager"] = 1] = "Manager"; 
    Role[Role["Admin"] = 2] = "Admin"; 
})(Role || (Role = {})); 
let role = Role.Employee; 

任何想法,爲什麼?使用這種方法Role.Employee的值爲0,並且在運行時可以使用任何其他值爲0的枚舉代替Role.Employee

+3

看看這個問題:[允許數字以外的類型](https://github.com/Microsoft/TypeScript/issues/1206) –

+0

@NitzanTomer,謝謝,我來看看 –

回答

4

ES Symbol是關於唯一性,而TypeScript enum是關於命名常量。正在獨特和正在恆定是兩個不同的東西。

我們可以序列化enum結構,因爲它本質上只是一個對象。但是Symbol是一個不同的故事。你不能序列化它。

因此,當我們說不變時,我們實際上是指使用該值,因爲它正是enum提供的值。但是Symbol不是您想要使用的值。它更像是我們希望讓任何人都無法克隆/複製的身份。

常數是保持不變的東西。因此,一些可以在兩種不同環境中運行的代碼(如Node.js和Browser)都將理解常量值相同(簡單地說,開發人員爲常量,例如字符串或數字創建一個值)。但是對於Symbol,想象它沒有任何價值的概念。如果我們嘗試將它用作值,那麼它意味着它是兩個單獨的東西(因爲運行時正在創建這些值,而不是開發人員)。

同樣,如果您使用過REDX,我們更喜歡string而不是Symbol來代表我們的行動。

此外,in case of TypeScript,enum也可以用作ambientsubstitution的值。在這種情況下,它是enum值關鍵的唯一編譯器。編譯期間,type erasure可能會刪除enum參考。現在,這是你無法用Symbol做的事情。創建Symbol是僅限運行時活動。所以如果我們使用Symbolenum,那麼我們輸給enum的能力爲,編譯時只有的功能。

因此不使用Symbol對於enum似乎是明智的選擇。

相關問題