typescript枚舉的具體使用
官方定義
使用枚舉我們可以定義一些帶名字的常量。 使用枚舉可以清晰地表達意圖或創(chuàng)建一組有區(qū)別的用例。 TypeScript支持數(shù)字的和基于字符串的枚舉。枚舉使用 enum 關(guān)鍵字來定義。
理解:
枚舉是列舉固定幾個值,用于取值被限定在一定范圍內(nèi)的場景,比如一周只能有七天,顏色限定為紅綠藍等。
直接定義變量的話的話可以隨意定義,枚舉只能使用你定義好的幾個值
例如你定義一個方法接收一個參數(shù),這個參數(shù)如果是int型,別人在調(diào)用你這個方法時可以傳1或2等任意數(shù)字,雖然你告訴了同事,只能傳0或1,如果你把參數(shù)定義成只能傳某個類型,例如是個枚舉類,那么別人只能傳你枚舉類里定義好的幾個類型,傳其它的就會在編譯時期報錯。
按照枚舉成員分類(數(shù)字、字符串、異構(gòu))
一、數(shù)字枚舉
例1
enum Direction {
Up, // 0
Down,// 1
Left,// 2
Right// 3
}例2
enum Direction {
Up = 1,// 1
Down,// 2
Left,// 3
Right// 4
}例3
enum Direction {
Up,// 0
Down=3,// 3
Left,// 4
Right// 5
}例4
enum Days {Sun = 3, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 3); // true
console.log(Days["Wed"] === 3); // true
console.log(Days[3] === "Sun"); // false
console.log(Days[3] === "Wed"); // true以上四個例子我們可以看出
- 數(shù)字枚舉如果沒有初始化,默認初始化值為0,每項+1
- 如果有初始化,則在初始化值的基礎(chǔ)上,每項+1
- 如果某項被賦值(可以是負數(shù)或負數(shù)),那么之后的項在此基礎(chǔ)上+1
- 如果未手動賦值的枚舉項與手動賦值的重復了,如例4,TypeScript 是不會察覺到這一點的,但建議盡量避免
反向映射
除了創(chuà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
console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
console.log(Days[2] === "Tue"); // true
console.log(Days[6] === "Sat"); // true二、字符串枚舉
在一個字符串枚舉里,每個成員都必須用字符串字面量,或另外一個字符串枚舉成員進行初始化。
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}三、異構(gòu)枚舉
將數(shù)字枚舉與字符串枚舉混用,但不建議
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}按照聲明方式(普通枚舉,const 枚舉,外部枚舉,外部常量枚舉)
一、普通枚舉
上述例子都是常數(shù)項
值由計算所得變?yōu)橛嬎闼庙?/p>
如, "blue".length 就是一個計算所得項
enum Color {Red, Green, Blue = "blue".length};以下情況不被允許
enum Color {Red = "red".length, Green, Blue};根據(jù)官方定義,不帶初始化器的枚舉要么被放在第一的位置,要么被放在使用了數(shù)字常量或其它常量初始化了的枚舉后面。
上述代碼會報錯,因為Red是計算項,而Green緊接其后卻無法獲取初始值
二、常數(shù)枚舉 ( const enum 定義的枚舉)
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];會被編譯為
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
常數(shù)枚舉與普通枚舉的區(qū)別是,它會在編譯階段被刪除,并且不能包含計算成員,假如包含了計算成員,則會在編譯階段報錯。
三、外部枚舉( declare enum 定義的枚舉)
種聲明枚舉的方式比較特別,使用的時候需要非常謹慎,該枚舉類型不會生成反向映射
// 聲明語 + 關(guān)鍵詞 + 枚舉名稱
declare enum ChineseZodiac {
rat = 1,
cattle,
tiger,
rabbit,
dragon
}
console.log(ChineseZodiac)
console.log(ChineseZodiac.rat)你會發(fā)現(xiàn),無論你是訪問枚舉本身還是內(nèi)部成員,均會報錯: ChineseZodiac is not defined編譯之后并沒有生成該枚舉,也就是說,聲明的外部枚舉是沒有被編譯的,導致在 runtime 的時候就會報錯這就讓人很頭疼,既然不能訪問,那為何要能做出這個聲明呢。
官網(wǎng)對其的描述是:外部枚舉用來描述已經(jīng)存在的枚舉類型的形狀,這樣聽起來很晦澀。
通過代碼來分析
外部枚舉是為了描述當前環(huán)境中已經(jīng)存在的對象的,這個對象可以存在任意的地方,但是一定是已聲明的;1-1- 一個 .html 后綴文件,為了引入 .ts 文件編譯之后的結(jié)果,用于調(diào)試

1-2- .ts 源文件

1-3- 編譯之后的 .js 文件

1-4- 其他 .js 資源文件

1-5- 訪問結(jié)果

會發(fā)現(xiàn)是不會報錯的,但是你可能會疑問了,這個不就是訪問自己聲明的一個變量嗎,那跟 .ts 文件中聲明的枚舉有什么關(guān)系?圖樣圖森破,外部枚舉類似于 ts 的類型斷言,只要在開發(fā)中有這個聲明,意味著在當前開發(fā)環(huán)境上下文中一定存在當前這個對象,你可以隨意使用當前對象;當然也就意味著你聲明外部枚舉的時候慎重,我是否真的需要這樣做,不然 runtime 使用的時候就出錯了;
外部枚舉還可以防止聲明枚舉的命名沖突和成員沖突
2-1- 我在上面文件結(jié)構(gòu)基礎(chǔ)上新增了一個 enum.ts 文件,并在里面聲明了一個普通枚舉,但是枚舉成員和外部枚舉成員相同

2-2- 之所以會有這樣的提示,是 declare 的作用,因為 ts 類型系統(tǒng)能夠偵測到當前整個文件目錄上下文中的所有 declare 聲明的變量,編譯器也會有語法提示;
四、外部常量枚舉(declare 和 const 關(guān)鍵詞聯(lián)合聲明)
這個枚舉類型和 const 枚舉類型并沒有什么區(qū)別,只是會提示是否有枚舉命名沖突和成員沖突,該枚舉類型不會生成反向映射
// 聲明語 + 修飾符 + 關(guān)鍵詞 + 枚舉名稱
declare const enum ChineseZodiac {
rat = 1,
cattle,
tiger,
rabbit,
dragon
}
ChineseZodiac.dragon => 5/* dragon */到此這篇關(guān)于typescript枚舉的具體使用的文章就介紹到這了,更多相關(guān)typescript枚舉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在IE中調(diào)用javascript打開Excel的代碼(downmoon原作)
在IE中調(diào)用javascript打開Excel的代碼(downmoon原作)...2007-04-04
【JS+CSS3】實現(xiàn)帶預覽圖幻燈片效果的示例代碼
下面小編就為大家?guī)硪黄綣S+CSS3】實現(xiàn)帶預覽圖幻燈片效果的示例代碼。小編覺得挺不錯的,現(xiàn)在分享給大家。給大家一個參考2016-03-03
javascript獲取select的當前值示例代碼(兼容IE/Firefox/Opera/Chrome)
本篇文章主要介紹了javascript獲取select的當前值示例代碼(兼容IE/Firefox/Opera/Chrome) 需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12
three.js設(shè)置物體的縮放和旋轉(zhuǎn)代碼示例
最近在用three.js做三維模型的時候,需要通過鼠標滑輪向前來控制視角朝鼠標的位置放大,然后通過鼠標滑輪向后將視角復原,這篇文章主要給大家介紹了關(guān)于three.js如何設(shè)置物體的縮放和旋轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下2023-11-11
javascript 漢字轉(zhuǎn)拼音實現(xiàn)代碼
主要是提前定義了很多文字,這樣的方法不是很是,如果庫中沒有這個詞,是看不到相關(guān)信息的。2009-12-12

