最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端常見(jiàn)的枚舉管理方式指南

 更新時(shí)間:2026年05月14日 10:41:37   作者:前端畢業(yè)班  
枚舉Enum是在多種語(yǔ)言中都有的一種數(shù)據(jù)類型,用于表示一組特定相關(guān)的常量數(shù)據(jù)集合,如性別、數(shù)據(jù)狀態(tài)、垂直對(duì)齊、星期等,這篇文章主要介紹了前端常見(jiàn)的枚舉管理方式指南的相關(guān)資料,需要的朋友可以參考下

寫在前面

前端里的“枚舉”,本質(zhì)上是在解決以下問(wèn)題:

  • 限制狀態(tài)范圍
  • 提高可讀性
  • 提高類型安全
  • 避免魔法字符串
  • 方便 UI 映射
  • 方便 AI 理解

下面作者為同學(xué)們總結(jié)了前端領(lǐng)域常見(jiàn)的枚舉方式:

Typescript 的 enum 枚舉類型

enumTypescript 原生支持的枚舉類型。許多同學(xué)不知道的是,枚舉的定義方式是有區(qū)別的,定義方式會(huì)決定 enum 的應(yīng)用方式,分為 enumconst enum

enum

支持定義數(shù)字和字符串,定義/使用方式如下:

enum Status {
  Pending,
  Success,
  Failed
}

Status.Pending // 0
enum Status {
  Pending = 'pending',
  Success = 'success',
  Failed = 'failed'
}

Status.Pending // pending

數(shù)字類型支持反向映射,如:

Status[Status.Pending] // Pending

字符串類型不支持反向映射,因?yàn)?enum 編譯后會(huì)輸出大致這樣的代碼:

// input
enum Status {
  Pending,
  Success,
  Failed
}

// output
const Status = {
  Pending: 0,
  Success: 1,
  Failed: 2,

  0: "Pending",
  1: "Success",
  2: "Failed"
}

字符串會(huì)在設(shè)計(jì)層面有很多限制,這里隨便舉個(gè)例子:

// input
enum Vector {
  X = 'Y',
  Y = 'Z',
  Z = 'X'
}

// output 命名空間已經(jīng)明顯亂掉了, 假設(shè)訪問(wèn) Vector['X'],都不知道訪問(wèn)的是哪一個(gè)。
const Vector = {
  X: 'Y',
  Y: 'Z',
  Z: 'X',

  Y: 'X',
  Z: 'Y',
  X: 'Z'
}

const enum 枚舉

上文的 enum 是包含 運(yùn)行時(shí) 的,Typescript 會(huì)編譯出一個(gè) Javascript 對(duì)象,但對(duì) bundle 尺寸和性能有要求的庫(kù),需要一種更輕的枚舉類型,這就是后來(lái) Typescript 團(tuán)隊(duì)支持的 const enum 特性。定義/使用方式如下:

const enum Status {
  Pending,
  Success,
  Failed
}

Status.Pending // 0

它不支持雙向映射,因?yàn)?ts 會(huì)在編譯時(shí)將 Status 抹去,只把 Status.Pending 的調(diào)用直接替換成字面量 0。

對(duì)象枚舉

絕大部分的前端工程師的工作還是以業(yè)務(wù)為主,更多只是單純的尋求 好用 + 實(shí)用 + 類型安全,基本不會(huì)在意 bundle 尺寸,實(shí)際上對(duì)于 Web App 來(lái)說(shuō),枚舉也不會(huì)帶來(lái)明顯的 bundle 尺寸增長(zhǎng)。 這也催生出了對(duì)象枚舉的定義方式,優(yōu)勢(shì)在于開發(fā)者可以自由的定義映射,類型使用也更加明確簡(jiǎn)單。

const Status = {
  Pending: 'pending',
  Success: 'success',
  Failed: 'failed'
} as const 

// as const 是必須的,影響下面的 type Status,對(duì) as const 感興趣的同學(xué)可以去問(wèn)一下 AI,這里就不展開了。

const StatusLabels = {
  [Status.Pending]: '準(zhǔn)備中',
  [Status.Success]: '成功',
  [Status.Failed]: '失敗',
}

// 這個(gè)類型工具可以提取成通用工具
type ValueOf<T> = T[keyof T]

type Status = ValueOf<typeof Status> // 'pending' | 'success' | 'failed'

Status.Pending // 'pending'
StatusLabels[Status.Pending] // '準(zhǔn)備中'

enum-plus

對(duì)象枚舉雖然一定程度的解決了業(yè)務(wù)問(wèn)題,但定義起來(lái)實(shí)在有點(diǎn)復(fù)雜,雖然這對(duì)于 AI 來(lái)說(shuō)不是什么難事,但枚舉的信息密度非常低,不夠內(nèi)聚,關(guān)注點(diǎn)不夠聚焦,AI 也經(jīng)常犯迷糊。 但好在開發(fā)社區(qū)也有解決方案,比如 enum-plus。

import { Enum } from 'enum-plus'

const WeekEnum = Enum({
  Sunday: { value: 0, label: 'I love Sunday' },
  Monday: { value: 1, label: 'I hate Monday' },
});

WeekEnum.Sunday; // 0
WeekEnum.items[0].key; // 'Sunday'
WeekEnum.items[0].label; // 'I love Sunday'

作者找到這個(gè)庫(kù)的時(shí)候也是想要直接集成到項(xiàng)目里的,因?yàn)樗δ芊浅XS富,提供了 非常非常多 的 api。但同時(shí)我也覺(jué)得 api 過(guò)于復(fù)雜了,并且似乎類型約束相對(duì)松散,無(wú)法直接完成遷移(除非犧牲類型安全)比如:

import { Enum } from 'enum-plus'

const WeekEnum = Enum({
  Sunday: { value: 0, label: 'I love Sunday' },
  Monday: { value: 1, label: 'I hate Monday' },
})

console.log(WeekEnum.Sunday)
// 這里不會(huì)報(bào)類型錯(cuò)誤,但 `2` 不是一個(gè)合法的枚舉值,enum-plus 在這種情況下會(huì)返回 undefined,雖然也是合理的,但作者更傾向于嚴(yán)格一些類型約定。
console.log(WeekEnum.label(2))

enumOf

最后是作者自己的版本,個(gè)人比較滿意。實(shí)現(xiàn)較為輕量,api 也比較簡(jiǎn)單,并且類型安全,國(guó)際化支持也非常容易,同時(shí)開源并集成到了 rattail 工具庫(kù)里,有需要的同學(xué)可以自取。下面是常用案例。

import { enumOf } from 'rattail'

const Status = enumOf({
  Success: { value: 0, label: 'Success' },
  // 字段支持函數(shù)返回,國(guó)際化支持很簡(jiǎn)單。
  Warning: { value: 1, label: () => t('global.warning') },
})

Status.Success // 0
Status.label(Status.Success) // 'Success'
Status.options()
/*
[
  { value: 0, label: 'Success'},
  { value: 1, label: 'Warning' },
]
*/
Status.values() // [0, 1]
Status.labels() // ['Success', 'Warning']

你也可以借助 rattail 內(nèi)置的函數(shù)去調(diào)整 .options() 返回的數(shù)據(jù)結(jié)構(gòu),這個(gè)在業(yè)務(wù)開發(fā)里很常見(jiàn)。

import { rekey } from 'rattail'

Status.options().map(option => rekey(option, { value: 'key' }))
/*
[
  { key: 0, label: 'Success'},
  { key: 1, label: 'Warning' },
]
*/

你也可以選擇擴(kuò)展更多字段,它們都會(huì)有完善的類型推導(dǎo)。

const Status = enumOf({
  Success: { value: 1, label: 'Success', color: 'green' },
  Warning: { value: 2, label: 'Warning', color: 'orange' },
})

Status.option(Status.Success).color // 'green'

寫在最后

到此這篇關(guān)于前端常見(jiàn)的枚舉管理方式指南的文章就介紹到這了,更多相關(guān)前端枚舉管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript 類型判斷代碼分析

    javascript 類型判斷代碼分析

    今天看到 司徒一篇blog, javascript深拷貝,其中涉及到一種判斷類型的方法,特分析如下
    2010-03-03
  • 一文詳細(xì)講講7種常見(jiàn)的前端攻擊

    一文詳細(xì)講講7種常見(jiàn)的前端攻擊

    這篇文章主要給大家介紹了7種常見(jiàn)的前端攻擊,包括跨站腳本(XSS)、依賴庫(kù)風(fēng)險(xiǎn)、跨站請(qǐng)求偽造(CSRF)、點(diǎn)擊劫持(Clickjacking)、內(nèi)容交付網(wǎng)絡(luò)(CDN)劫持、HTTPS降級(jí)和中間人攻擊,每種攻擊都有其攻擊方式和防御措施,需要的朋友可以參考下
    2024-11-11
  • 快速上手uni-simple-router

    快速上手uni-simple-router

    這篇文章主要介紹了uni-simple-router,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • 微信小程序按鈕點(diǎn)擊事件示例代碼

    微信小程序按鈕點(diǎn)擊事件示例代碼

    在微信小程序中,實(shí)現(xiàn)按鈕點(diǎn)擊跳轉(zhuǎn)頁(yè)面是一個(gè)常見(jiàn)的功能需求,這篇文章主要介紹了微信小程序按鈕點(diǎn)擊事件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • layer子層給父層頁(yè)面元素賦值,以達(dá)到向父層頁(yè)面?zhèn)髦档男Ч麑?shí)例

    layer子層給父層頁(yè)面元素賦值,以達(dá)到向父層頁(yè)面?zhèn)髦档男Ч麑?shí)例

    下面小編就為大家?guī)?lái)一篇layer子層給父層頁(yè)面元素賦值,以達(dá)到向父層頁(yè)面?zhèn)髦档男Ч麑?shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • javascript使用鏈接跨域下載圖片

    javascript使用鏈接跨域下載圖片

    這篇文章主要介紹了javascript使用鏈接跨域下載圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 用JavaScript 判斷用戶使用的是 IE6 還是 IE7

    用JavaScript 判斷用戶使用的是 IE6 還是 IE7

    判斷IE瀏覽器的腳本,方便根據(jù)瀏覽器不懂,支持不同的代碼的分別調(diào)用。
    2008-01-01
  • bootstrapValidator 重新啟用提交按鈕的方法

    bootstrapValidator 重新啟用提交按鈕的方法

    bootstrapValidator 使用中,由于字段檢查等原因,致使提交按鈕失效。如何重新啟用提交按鈕呢?下面小編給大家介紹下bootstrapValidator 重新啟用提交按鈕的方法,需要的朋友可以參考下
    2017-02-02
  • JavaScript獲取Url里的參數(shù)

    JavaScript獲取Url里的參數(shù)

    這篇文章主要介紹了JavaScript獲取Url里的參數(shù),需要的朋友可以參考下
    2014-12-12
  • 詳解JS ES6編碼規(guī)范

    詳解JS ES6編碼規(guī)范

    本章節(jié)討論使用ES6編碼風(fēng)格到代碼中需要注意的點(diǎn)。通過(guò)記住這些關(guān)鍵點(diǎn),可以讓我們寫出更優(yōu)美的、可讀性更強(qiáng)的JavaScript ES6風(fēng)格的代碼。
    2021-05-05

最新評(píng)論

盖州市| 墨江| 高雄县| 龙江县| 竹山县| 锡林浩特市| 周口市| 余姚市| 宁蒗| 河南省| 迁安市| 上林县| 马公市| 萍乡市| 和政县| 苗栗县| 白朗县| 黑山县| 灵寿县| 舟曲县| 平利县| 嵊州市| 周宁县| 磴口县| 榆中县| 南澳县| 株洲县| 日喀则市| 海盐县| 夏河县| 衡阳县| 蒙阴县| 句容市| 平乡县| 绥芬河市| 巴青县| 铁岭市| 武宁县| 万安县| 高密市| 乌拉特中旗|