首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Typescript 的枚举可能不是你想象的那样

Typescript 的枚举可能不是你想象的那样

原创
作者头像
zayyo
发布于 2023-11-29 13:45:04
发布于 2023-11-29 13:45:04
2160
举报
文章被收录于专栏:zayyo前端zayyo前端

如果你对枚举(enum)的外观不熟悉,这里有一些示例:

代码语言:typescript
AI代码解释
复制
enum Direction {
  Up = 1,
  Down, // 2
  Left, // 3
  Right, // 4
}

参考资料:

代码语言:txt
AI代码解释
复制
<p>
    <a href="https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings">枚举 - TypeScript手册</a>
</p>

枚举作为常量的集合。这可能会很有用,尤其是当你想要具有非常独特的键时:

代码语言:typescript
AI代码解释
复制
enum DirectiveKeys {
    Skip = '__c_skip_me_',
    Remove = '__c_remove_me_',
    Add = '__c_add_me_'
}

const objectThatShouldBeSkipped = {
    action: DirectiveKeys.Skip
}

使用它们的原因:

当使用枚举时,它锁定了常量,并将其保持在可管理的对象格式中:

代码语言:typescript
AI代码解释
复制
const DirectiveKeys = {
    Skip: '__c_skip_me_',
    Remove: '__c_remove_me_',
    Add: '__c_add_me_'
}

DirectiveKeys.Skip = '哎呀,这仍然是可变的';

const objectThatShouldBeSkipped = {
    action: DirectiveKeys.Skip // 永远不会被跳过
}

当使用枚举时,你还可以具有隐含的值:

代码语言:typescript
AI代码解释
复制
enum ExplicitValues {
    Up = 0,
    Down = 1,
    Right = 2,
    Left = 3
}

与下面的写法相同:

代码语言:typescript
AI代码解释
复制
enum ImplicitValues {
    Up,
    Down,
    Right,
    Left
}

不使用它们的原因:

它们没有被抽象化。没错,TypeScript 的枚举被编译进你的代码。你可能会说:“算了,反正是 TypeScript,它们知道自己在做什么。” 但他们所做的是将这个:

代码语言:typescript
AI代码解释
复制
enum Const {
    Up,
    Down,
    Right,
    Left
}

转换成这样:

代码语言:typescript
AI代码解释
复制
var Const;
(function (Const) {
    Const[Const["Up"] = 0] = "Up";
    Const[Const["Down"] = 1] = "Down";
    Const[Const["Right"] = 2] = "Right";
    Const[Const["Left"] = 3] = "Left";
})(Const || (Const = {}));

作为一个喜欢小型软件包的人,这是一段非常令人沮丧的代码。将枚举转换为对象/常量可以节省数百字节。为什么?

对于每个枚举,都有类似上面的 JavaScript 片段进行匹配。

生成的 JavaScript 只有在存在 TypeScript 时才能防止突变。否则它可以很容易地被覆盖,这是枚举类型的一个主要卖点。

这是使用 Proxy 生成枚举的原始方法:

代码语言:typescript
AI代码解释
复制
const Enum = (enums) => {
    Object.entries(enums).forEach((enums, [ key, value ]) => {
        enums[value] = key;
        return enums;
    })
    return new Proxy(enums, {
        get(target, key) {
            return target[key];
        },
        removeProperty: () => false,
        set: () => false,
    })
}

这禁止了添加或删除属性的能力,同时生成了 TypeScript 枚举生成的交替键值。

另一个好处?它是可重用的,并且不会创建相同代码的多个副本!

代码语言:typescript
AI代码解释
复制
const Directions = Enum({
    Up: 1,
    Down: 2,
    Right: 3,
    Left: 4
});

const Compass = Enum([
    "North",
    "East",
    "South",
    "West"
]);

哇,对于任何人来说都可以使用的生产就绪代码,太棒了!

现在等一下。

我的代码片段与 TypeScript 生成的代码的区别在于,我的代码利用了 ES6+ 的功能,比如 Proxy。如果你的目标受众不包括这个,那我只能说抱歉。

我的代码片段也没有 Microsoft 和 TypeScript 团队的支持,这意味着它没有经过充分的测试。

使用 TypeScript 枚举的最终和最重要的原因是?它们具有所有的智能提示优势。也许有一天我会为我的小函数开发一个相同的智能提示类型。

在那之前,随便你怎么做吧。

附言:

我认为生成的代码可能需要稍微更新一下。比如,使用箭头函数应该没问题。

代码语言:typescript
AI代码解释
复制
var Const;
((Const) => {
    Const[Const["Up"] = 0] = "Up";
    Const[Const["Down"] = 1] = "Down";
    Const[Const["Right"] = 2] = "Right";
    Const[Const["Left"] = 3] = "Left";
})(Const || (Const = {}));

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
保姆级Nginx日志配置文件总结
Nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在Nginx的配置文件的日志配置(/usr/local/nginx/conf/nginx.conf)。
兔云小新LM
2023/03/24
3K0
nginx.conf 配置详解(六)
日志级别从低到高分别是:debug、info、notice、warn、error、crit
高大北
2022/06/14
6290
nginx.conf 配置详解(六)
Nginx配置中的log_format用法梳理(设置详细的日志格式)
nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)。 log_format指令用来设置日志的记录格式,它的语法如下: log_format name format {format ...} 其中name表示定义的格式名称,format表示定义的格式
洗尽了浮华
2018/01/22
4.7K0
Nginx日志文件格式及切割日志文件
作为Web服务器而言,日志是必不可少的也是需要经常查看的。此篇就来介绍下如何自定义Nginx中的日志格式以及使用crontab计划任务来做到每天切割一次日志文件从而做到方便管理。
星哥玩云
2022/07/03
1.4K0
Nginx日志文件格式及切割日志文件
nginx日志配置
日志对于统计排错来说非常有利的。本文总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。 nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx_http_log_module是用来定义请求日志格式的。
用户5640963
2019/07/26
1.4K0
Nginx 不受 CDN 服务影响获取访客真实 IP
获取和记录站点访客的真实 IP 对于站点日志的分析和安全策略的指定很有帮助,Nginx 默认的日志记录获取到的 IP 地址如果站点启用了 CDN 服务,那么这里的 IP 地址都是 CDN 服务器节点的 IP 地址了,并不是用户访客的 IP 地址(如图 1),这时候分析 Nginx 日志看到的数据就不是很真实了,影响判断呀!今天明月就给大家分享一个 Nginx 不受 CDN 服务影响获取访客真实 IP 的方法。
双面人
2019/04/10
2K0
Nginx 不受 CDN 服务影响获取访客真实 IP
深入解析Nginx配置文件
Nginx是一款高性能的HTTP和反向代理服务器,广泛应用于各类Web服务器。作为一名测试工程师,了解Nginx配置文件的细节有助于更好地进行测试和优化服务器性能。本文将详细介绍Nginx配置文件的结构及其主要配置项。
霍格沃兹测试开发Muller老师
2024/06/19
3K0
nginx: [emerg] unknown log format "access" in错误解决方法
在centOS系统中配置域名的过程中,访问浏览器可能出现 如下错误: nginx: [emerg] unknown log format “access”。
network_dream
2023/11/13
4070
NGINX日志配置总结
本来准备讲解nginx和apache的日志的,但是个人不太推荐apache(纯属个人爱好),这里就不介绍apache的日志了。
CrazyCodes
2018/09/18
1.4K0
网站使用CDN的情况下nginx日志如何记录真实IP
网站使用了 CDN 的情况下,nginx 的访问日志只会记录节点 IP,无法记录用户真实访问 IP。下面就教大家如何记录用户真实 IP。以宝塔面板为例:
是山河呀
2024/08/17
4890
nginx日志格式分析
这其中有个$http_x_forworded_for ,当前端有代理服务器时,设置web节点记录客户端IP,同时代理服务器也需要进行相关http_x_forworded_for的配置
全栈程序员站长
2022/08/22
2K0
搭建 LNMP + CodeIgniter 开发环境
搭建 LNMP + CodeIgniter 开发环境 搭建 LNMP 环境 首先搭建 LNMP 的服务器环境 安装 Nginx, MySQL 和 PHP 软件包 执行以下命令: yum install -y nginx mariadb-server mariadb php php-fpm php-mysql
仇诺伊
2018/09/12
2.4K0
haproxy转发真实IP给web
1.在haproxy.cfg中加入下面参数。 option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,必须要放在listen模块下
相柳
2019/05/17
3K0
ELK+filebeat+nginx+json 日志分析综合实战
2,将nginx日志改成json格式,这样各个字段就方便最终在kibana进行画图统计了
张哥编程
2024/12/07
1970
ELK+filebeat+nginx+json 日志分析综合实战
Nginx 日志格式配置介绍
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
授客
2019/09/11
3K0
CentOS下Nginx配置Web访问日志并结合Shell脚本定时切割
在一个成熟的WEB系统里,没有日志管理是不可以的,有了日志,可以帮助你得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。
星哥玩云
2022/07/26
6580
CentOS下Nginx配置Web访问日志并结合Shell脚本定时切割
Nginx日志管理——了解Nginx日志选项配置以及自定义日志格式使用「建议收藏」
不管什么程序,一般都会有日志的。哪怕你在浏览器上网访问了一个网站,也会有记录保存的。在这个里互联网时代,想在网上不留下痕迹那是很难的。在我们开发一个程序,日志功能往往也是不可缺少的,今天我们就来讲讲这个Nginx的日志是怎么样来玩的。
全栈程序员站长
2022/09/07
2.1K0
Nginx日志管理——了解Nginx日志选项配置以及自定义日志格式使用「建议收藏」
nginx 日志管理「建议收藏」
#access_log logs/host.access.log main;
全栈程序员站长
2022/09/01
9620
初识nginx基础篇-日志管理和切割
Nginx日志主要分为两种,访问日志和错误日志。两种日志可以在http和server模块中配置,nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义
后端技术探索
2018/08/09
1.3K0
Nginx日志配置及日志分析脚本案例
其中access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
菲宇
2019/06/12
3.1K0
相关推荐
保姆级Nginx日志配置文件总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档