欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

typescript枚舉的具體使用

 更新時間:2023年09月11日 15:56:59   作者:微?光  
使用枚舉我們可以定義一些帶名字的常量,本文主要介紹了typescript枚舉的具體使用,具有一定的參考價值,感興趣的可以了解一下

官方定義

使用枚舉我們可以定義一些帶名字的常量。 使用枚舉可以清晰地表達(dá)意圖或創(chuàng)建一組有區(qū)別的用例。 TypeScript支持?jǐn)?shù)字的和基于字符串的枚舉。枚舉使用  enum  關(guān)鍵字來定義。

理解:

枚舉是列舉固定幾個值,用于取值被限定在一定范圍內(nèi)的場景,比如一周只能有七天,顏色限定為紅綠藍(lán)等。

直接定義變量的話的話可以隨意定義,枚舉只能使用你定義好的幾個值

例如你定義一個方法接收一個參數(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ù)字枚舉如果沒有初始化,默認(rèn)初始化值為0,每項+1
  • 如果有初始化,則在初始化值的基礎(chǔ)上,每項+1
  • 如果某項被賦值(可以是負(fù)數(shù)或負(fù)數(shù)),那么之后的項在此基礎(chǔ)上+1
  • 如果未手動賦值的枚舉項與手動賦值的重復(fù)了,如例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

二、字符串枚舉

在一個字符串枚舉里,每個成員都必須用字符串字面量,或另外一個字符串枚舉成員進(jìn)行初始化。

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  定義的枚舉)

種聲明枚舉的方式比較特別,使用的時候需要非常謹(jǐn)慎,該枚舉類型不會生成反向映射

// 聲明語 + 關(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編譯之后并沒有生成該枚舉,也就是說,聲明的外部枚舉是沒有被編譯的,導(dǎo)致在 runtime 的時候就會報錯這就讓人很頭疼,既然不能訪問,那為何要能做出這個聲明呢。

官網(wǎng)對其的描述是:外部枚舉用來描述已經(jīng)存在的枚舉類型的形狀,這樣聽起來很晦澀。

通過代碼來分析

外部枚舉是為了描述當(dā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ā)中有這個聲明,意味著在當(dāng)前開發(fā)環(huán)境上下文中一定存在當(dāng)前這個對象,你可以隨意使用當(dāng)前對象;當(dāng)然也就意味著你聲明外部枚舉的時候慎重,我是否真的需要這樣做,不然 runtime 使用的時候就出錯了;

外部枚舉還可以防止聲明枚舉的命名沖突和成員沖突

2-1- 我在上面文件結(jié)構(gòu)基礎(chǔ)上新增了一個 enum.ts 文件,并在里面聲明了一個普通枚舉,但是枚舉成員和外部枚舉成員相同

2-2- 之所以會有這樣的提示,是 declare 的作用,因為 ts 類型系統(tǒng)能夠偵測到當(dā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)文章

  • JS面試高頻單線程與事件循環(huán)深入解析

    JS面試高頻單線程與事件循環(huán)深入解析

    JavaScript是一種單線程語言,它在任何給定時間只能執(zhí)行一個任務(wù),然而js確能夠處理異步操作,這得益于其事件循環(huán)(Event Loop)機(jī)制,今天這篇文章帶領(lǐng)大家深入理解JavaScript單線程特性,以及講解事件循環(huán)和js多線程知識
    2023-10-10
  • 微信小程序開發(fā)實現(xiàn)輪播圖

    微信小程序開發(fā)實現(xiàn)輪播圖

    這篇文章主要為大家詳細(xì)介紹了微信小程序開發(fā)實現(xiàn)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • lightBox 簡易的全屏透明遮罩解決方法

    lightBox 簡易的全屏透明遮罩解決方法

    現(xiàn)在全屏的半透明遮罩層在web2.0網(wǎng)站應(yīng)用非常廣泛了,絕大多數(shù)遮罩是通過計算頁面大小,然后覆蓋一個與頁面同等大小的層實現(xiàn),如騰訊qzone, wordpress后臺。
    2010-06-06
  • js 獲取時間間隔實現(xiàn)代碼

    js 獲取時間間隔實現(xiàn)代碼

    獲取時間間隔在日常使用還是比價頻繁的,下面是具體的實現(xiàn)代碼,需要的朋友可以參考下
    2014-05-05
  • 項目中常用的JS方法整理

    項目中常用的JS方法整理

    這里給大家整理的是本人上個項目中所用到的js方法,都是些非常常用的javascript方法,相信小伙伴們也能經(jīng)常用到,這里整理出來分享給大家。
    2015-01-01
  • 詳解js創(chuàng)建對象的幾種方式和對象方法

    詳解js創(chuàng)建對象的幾種方式和對象方法

    這篇文章主要介紹了詳解js創(chuàng)建對象的幾種方式和對象方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • javascript單例模式的簡單實現(xiàn)方法

    javascript單例模式的簡單實現(xiàn)方法

    這篇文章主要介紹了javascript單例模式的簡單實現(xiàn)方法,以javascript創(chuàng)建唯一實例的形式分析了javascript單例模式的簡單實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • webpack DllPlugin xxx is not defined解決辦法

    webpack DllPlugin xxx is not defined解決辦法

    這篇文章主要介紹了webpack DllPlugin xxx is not defined解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 輕松掌握J(rèn)avaScript單例模式

    輕松掌握J(rèn)avaScript單例模式

    這篇文章主要為大家詳細(xì)介紹了JavaScript單例模式,幫助大家輕松掌握J(rèn)S單例模式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 用js判斷瀏覽器是否是IE的比較好的辦法

    用js判斷瀏覽器是否是IE的比較好的辦法

    用js判斷瀏覽器是否是IE的比較好的辦法...
    2007-05-05

最新評論