天天看點

Typescript使用字元串聯合類型代替枚舉類型

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';      

繼續閱讀