TypeScript宗旨
我覺得Typescript的宗旨是 任何一個 TypeScript 程式,在手動删去類型部分,将字尾改成 .js 後,都應能夠正常運作。Typescript是javascript的超集,是編譯期行為,不引入額外開銷,不改變運作時行為,始終與 ESMAScript 語言标準一緻。
但是enum類型了引入了 JavaScript 沒有的資料結構(編譯成一個雙向 map),入侵了運作時,與 TypeScript 宗旨不符。用 字元串聯合類型('enum1' | 'enum2' | 'enum3')可以做到相同的事,且在調試時可讀性更好。
以下 代碼展示了enum違背了宗旨的證據:
Enum實作
// TypeScript
enum Test {
enum1 = 2,
enum2,
enum3
}
const test:Test = Test.enum2; // 3
// 編譯為javscript
var Test;
(function (Test) {
Test[Test["enum1"] = 2] = "enum1";
Test[Test["enum2"] = 3] = "enum2";
Test[Test["enum3"] = 4] = "enum3";
})(Test || (Test = {}));
var test = Test.enum2; // 3
推薦聯合類型(string literal union)實作
// Typescript
type Test = 'enum1' | 'enum2' | 'enum3';
const test: Test = 'enum2';
// 編譯為javscript,非常簡單
var test = 'enum2';