TypeScript中枚舉類型的理解與應(yīng)用場(chǎng)景
一、是什么
枚舉是一個(gè)被命名的整型常數(shù)的集合,用于聲明一組命名的常數(shù),當(dāng)一個(gè)變量有幾種可能的取值時(shí),可以將它定義為枚舉類型
通俗來(lái)說(shuō),枚舉就是一個(gè)對(duì)象的所有可能取值的集合
在日常生活中也很常見(jiàn),例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就可以看成是一個(gè)枚舉
枚舉的說(shuō)明與結(jié)構(gòu)和聯(lián)合相似,其形式為:
enum 枚舉名{
標(biāo)識(shí)符①[=整型常數(shù)],
標(biāo)識(shí)符②[=整型常數(shù)],
...
標(biāo)識(shí)符N[=整型常數(shù)],
}枚舉變量;
二、使用
枚舉的使用是通過(guò)enum關(guān)鍵字進(jìn)行定義,形式如下:
enum xxx { ... }
聲明關(guān)鍵字為枚舉類型的方式如下:
// 聲明d為枚舉類型Direction let d: Direction;
類型可以分成:
- 數(shù)字枚舉
- 字符串枚舉
- 異構(gòu)枚舉
數(shù)字枚舉
當(dāng)我們聲明一個(gè)枚舉類型是,雖然沒(méi)有給它們賦值,但是它們的值其實(shí)是默認(rèn)的數(shù)字類型,而且默認(rèn)從0開(kāi)始依次累加:
enum Direction { Up, // 值默認(rèn)為 0 Down, // 值默認(rèn)為 1 Left, // 值默認(rèn)為 2 Right // 值默認(rèn)為 3 } console.log(Direction.Up === 0); // true console.log(Direction.Down === 1); // true console.log(Direction.Left === 2); // true console.log(Direction.Right === 3); // true
如果我們將第一個(gè)值進(jìn)行賦值后,后面的值也會(huì)根據(jù)前一個(gè)值進(jìn)行累加1:
enum Direction { Up = 10, Down, Left, Right } console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right); // 10 11 12 13
字符串枚舉
枚舉類型的值其實(shí)也可以是字符串類型:
enum Direction { Up = 'Up', Down = 'Down', Left = 'Left', Right = 'Right' } console.log(Direction['Right'], Direction.Up); // Right Up
如果設(shè)定了一個(gè)變量為字符串之后,后續(xù)的字段也需要賦值字符串,否則報(bào)錯(cuò):
enum Direction { Up = 'UP', Down, // error TS1061: Enum member must have initializer Left, // error TS1061: Enum member must have initializer Right // error TS1061: Enum member must have initializer }
異構(gòu)枚舉
即將數(shù)字枚舉和字符串枚舉結(jié)合起來(lái)混合起來(lái)使用,如下:
enum BooleanLikeHeterogeneousEnum { No = 0, Yes = "YES", }
通常情況下我們很少會(huì)使用異構(gòu)枚舉
本質(zhì)
現(xiàn)在一個(gè)枚舉的案例如下:
enum Direction { Up, Down, Left, Right }
通過(guò)編譯后,javascript如下:
var Direction; (function (Direction) { Direction[Direction["Up"] = 0] = "Up"; Direction[Direction["Down"] = 1] = "Down"; Direction[Direction["Left"] = 2] = "Left"; Direction[Direction["Right"] = 3] = "Right"; })(Direction || (Direction = {}));
上述代碼可以看到, Direction[Direction["Up"] = 0] = "Up"可以分成
- Direction["Up"] = 0
- Direction[0] = "Up"
所以定義枚舉類型后,可以通過(guò)正反映射拿到對(duì)應(yīng)的值,如下:
enum Direction { Up, Down, Left, Right } console.log(Direction.Up === 0); // true console.log(Direction[0]); // Up
并且多處定義的枚舉是可以進(jìn)行合并操作,如下:
enum Direction { Up = 'Up', Down = 'Down', Left = 'Left', Right = 'Right' } enum Direction { Center = 1 }
編譯后,js代碼如下:
var Direction; (function (Direction) { Direction["Up"] = "Up"; Direction["Down"] = "Down"; Direction["Left"] = "Left"; Direction["Right"] = "Right"; })(Direction || (Direction = {})); (function (Direction) { Direction[Direction["Center"] = 1] = "Center"; })(Direction || (Direction = {}));
可以看到,Direction對(duì)象屬性回疊加
三、應(yīng)用場(chǎng)景
就拿回生活的例子,后端返回的字段使用 0 - 6 標(biāo)記對(duì)應(yīng)的日期,這時(shí)候就可以使用枚舉可提高代碼可讀性,如下:
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; console.log(Days["Sun"] === 0); // true console.log(Days["Mon"] === 1); // true console.log(Days["Tue"] === 2); // true console.log(Days["Sat"] === 6); // true
包括后端日常返回0、1 等等狀態(tài)的時(shí)候,我們都可以通過(guò)枚舉去定義,這樣可以提高代碼的可讀性,便于后續(xù)的維護(hù)
參考文獻(xiàn)
https://zh.wikipedia.org/wiki/%E6%9E%9A%E4%B8%BE
總結(jié)
到此這篇關(guān)于TypeScript中枚舉類型的理解與應(yīng)用場(chǎng)景的文章就介紹到這了,更多相關(guān)TypeScript枚舉類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將Echarts圖表導(dǎo)出為圖片的3種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于將Echarts圖表導(dǎo)出為圖片的3種方法,Echarts是一種基于JavaScript的可視化庫(kù),用于創(chuàng)建豐富、交互式的圖表和地圖,而Excel是一種電子表格軟件,用于數(shù)據(jù)處理和分析,需要的朋友可以參考下2023-06-06javascript時(shí)間函數(shù)基礎(chǔ)介紹
這篇文章主要介紹了javascript中提供了Date對(duì)象來(lái)進(jìn)行時(shí)間和日期的計(jì)算,這里簡(jiǎn)單的介紹下, 方便需要的朋友2013-03-03鼠標(biāo)經(jīng)過(guò)子元素觸發(fā)mouseout,mouseover事件的解決方案
這篇文章主要介紹了鼠標(biāo)經(jīng)過(guò)子元素觸發(fā)mouseout,mouseover事件的解決方案的相關(guān)資料,需要的朋友可以參考下2015-07-07體驗(yàn)js中splice()的強(qiáng)大(插入、刪除或替換數(shù)組的元素)
javascript splice()算是最強(qiáng)大的了,它可以用于插入、刪除或替換數(shù)組的元素。下面來(lái)一一介紹,感興趣的朋友2013-01-01SVG動(dòng)畫(huà)vivus.js庫(kù)使用小結(jié)(實(shí)例代碼)
本文通過(guò)代碼給大家介紹SVG動(dòng)畫(huà)vivus.js庫(kù)使用小結(jié),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-0924個(gè)ES6方法解決JS實(shí)際開(kāi)發(fā)問(wèn)題(小結(jié))
這篇文章主要介紹了24個(gè)ES6方法解決JS實(shí)際開(kāi)發(fā)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法
這篇文章主要介紹了js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法,實(shí)例分析了window.onresize方法的使用技巧,需要的朋友可以參考下2015-02-02使用JavaScript實(shí)現(xiàn)一個(gè)物理模擬
最近掌門(mén)人在寫(xiě)3D游戲,對(duì)于其中的物理效果很感興趣,今天我將使用純JavaScript來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)易的物理模擬,其中包括碰撞檢測(cè)與響應(yīng)、摩擦力與空氣阻力、以及物體的破壞效果,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-01-01js頁(yè)面加載后執(zhí)行的幾種方式小結(jié)
在實(shí)際應(yīng)用中往往需要在頁(yè)面加載完畢之后再去執(zhí)行相關(guān)的js代碼,之所以這么操作是有道理的,如果是操作dom元素,如果相關(guān)元素沒(méi)有加載完成,而去執(zhí)行js代碼,可能會(huì)導(dǎo)致錯(cuò)誤2020-01-01