導(dǎo)語
在 TypeScript 中,新增了很多具有特性的一些數(shù)據(jù)類型處理方法,
enum 【枚舉】
就是其中,很具有代表性的一種,所以本章節(jié)就來聊聊 在 TypeScript 中如何去運用enum 【枚舉】
。
枚舉的概念
:
枚舉(Enum)類型
用于取值被限定在一定范圍內(nèi)的場景
,比如一周只能有七天,顏色限定為紅綠藍等。
枚舉使用 enum
關(guān)鍵字來定義:
enum DaysDataType {
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
};
console.log(DaysDataType);
默認賦值【自動賦值】
枚舉成員默認值會被賦值為從 0 開始遞增的索引數(shù)字,同時也會對枚舉值到枚舉名進行反向映射
上面輸出打印 枚舉 DaysDataType:
上面聲明的枚舉,最后被編譯為 JS 后,會呈現(xiàn)以下的樣式。
手動賦值
我們也可以給枚舉項手動賦值:
enum DaysDataType {
Sun = 7,
Mon = 14,
Tue = 21,
Wed = 54,
Thu,
Fri,
Sat
};
console.log(DaysDataType);
手動賦值后,再次注意看編譯后的內(nèi)容:
console.log(DaysDataType["Sun"] == 7); //true
console.log(DaysDataType["Mon"] == 14);//true
console.log(DaysDataType["Tue"] == 21);//true
console.log(DaysDataType["Wed"] == 54);//true
console.log(DaysDataType["Thu"] == 55);//true
console.log(DaysDataType["Fri"] == 56);//true
console.log(DaysDataType["Sat"] == 57);//true
上面案例可以看出,未手動賦值的枚舉項會接著上一個枚舉項的值進行遞增
。
注意
:如果手動賦值的為number
類型的值,下一位如果沒有手動賦值則會在上一次的基礎(chǔ)上遞增。并且所賦值的數(shù)字可以被用做數(shù)組的下標索引的方式
來讀取數(shù)據(jù),賦值非number
類型的不支持通過下標讀取
如:
enum DaysDataType {
Sun = "789",
Mon = 4546,
Tue = "415",
Wed = "asd",
Thu = "asdasd",
Fri = 41,
Sat = "asddf"
};
console.log(DaysDataType);
console.log(DaysDataType[4546]); //Mon
console.log(DaysDataType[41]); //Fri
截止目前TS 枚舉手動賦值僅支持 number
,string
,null
,undefined
,不支持 Boolean
值得注意
:
如果未手動賦值的枚舉項與手動賦值的重復(fù)了
,TypeScript 是不會察覺到這一點的,它會進行一個 后來居上
的覆蓋處理:
enum DaysDataType {
Sun = 7,
Mon = 14,
Tue = 21,
Wed = 54,
Thu = 13,
Fri, //14 根據(jù)前枚舉項 遞增,會覆蓋掉前面 Mon 的14。
Sat //15
};
console.log(DaysDataType[7] == "Sun"); //true
console.log(DaysDataType[14] == "Mon"); //false 被 Fri 覆蓋掉了,丟失了唯一性。
console.log(DaysDataType[21] == "Tue"); //true
console.log(DaysDataType[54] == "Wed"); //true
console.log(DaysDataType[13] == "Thu"); //true
console.log(DaysDataType[14] == "Fri"); //true // Fri 覆蓋掉了 Mon
console.log(DaysDataType[15] == "Sat"); //true
所以使用的時候需要特別注意,盡量避免出現(xiàn) 數(shù)據(jù)覆蓋的情況。
當(dāng)然:
手動賦值的枚舉項不僅僅可以不是數(shù)字類型
,此時需要使用類型斷言來讓 tsc 無視類型檢查 (編譯出的 js 仍然是可用的)
enum DaysDataType {
Sun = 7,
Mon = 14,
Tue = 21,
Wed = 54,
Thu = 13,
Fri,
Sat = <any>"張三" //類型斷言
};
同時,手動賦值的枚舉項也可以為小數(shù)或負數(shù)
,此時后續(xù)未手動賦值的項的遞增步長仍為 1
enum DaysDataType {
Sun = 1.5,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
};
console.log(DaysDataType);
枚舉的常數(shù)項和計算所得項
枚舉項有兩種類型:常數(shù)項(constant member)和計算所得項(computed member)
前面我們所舉的例子都是 常數(shù)項
,那么 計算所得項又是什么呢?如下案例:
enum Color {Red, Green, Blue = "blue".length};
案例中 Blue
的值是通過 一個字符串的 length
計算而得來的。這種就被稱為計算所得項。
注意
:如果緊接在計算所得項后面的是未手動賦值的項,那么它就會因為無法獲得初始值而報錯
常數(shù)枚舉
:
常數(shù)枚舉是使用 const enum
定義的枚舉類型
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; // let directions = [0 /* Directions.Up */, 1 /* Directions.Down */, 2 /* Directions.Left */, 3 /* Directions.Right */];
常數(shù)枚舉與普通枚舉的區(qū)別是,它會在編譯階段被刪除,并且不能包含計算所得項的枚舉成員
。主要作用是在編譯階段進行類型檢查。
外部枚舉
:
外部枚舉(Ambient Enums)是使用
declare enum
定義的枚舉類型。
declare enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
//let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
declare
定義的類型只會用于編譯時的檢查,編譯結(jié)果中會被刪除。
同時使用 declare
和 const
也是可以被支持的。
declare 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 */];
總結(jié):
本章節(jié),主要介紹了在 TypeScript 中 如何應(yīng)用 enum 【枚舉】的使用場景,以及使用枚舉的多種定義方式。提供給大家參考學(xué)習(xí)。文章來源:http://www.zghlxwxcb.cn/news/detail-626779.html
???♂? 博主座右銘:向陽而生,我還在路上!
——————————————————————————————
??博主想說:將持續(xù)性為社區(qū)輸出自己的資源,同時也見證自己的進步!
——————————————————————————————
???♂? 如果都看到這了,博主希望留下你的足跡!【??收藏!??點贊!??評論!】
——————————————————————————————文章來源地址http://www.zghlxwxcb.cn/news/detail-626779.html
到了這里,關(guān)于TypeScript【enum 枚舉】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!